Як перетворити хешмап на об'єкт JSON в Java


287

Як перетворити або закинути хешмап до об’єкта JSON на Java та знову перетворити об’єкт JSON у рядок JSON?

Відповіді:


435

Ви можете використовувати:

new JSONObject(map);

Застереження. Це буде працювати лише для аMap<String, String>!

Інші функції ви можете отримати з його документації
http://stleary.github.io/JSON-java/index.html


85
Це працює лише для карти String, String, а не для складної String, Object.
слот

2
Ви ставите Mapв JSONObjectале як ви можете отримати цю карту від JSONObject?
Юбарай

1
@Yubi це може допомогти вам: stackoverflow.com/questions/21720759/convert-jsonobject-to-map
Hannoun Ясір

8
@slott підходить для старих версій. Новіші версії, такі як kitkat, добре працюють із складнішими об'єктами, такими як HashMap <String, Object> (), що містять HashMap <String, Object> () як Object. Тому я рекомендую Gson.
Луїсмі

Я щойно шукав його
Наїд Ахмед

169

Gson також може використовуватися для серіалізації довільно складних об'єктів.

Ось як ви його використовуєте:

Gson gson = new Gson(); 
String json = gson.toJson(myObject); 

Gsonавтоматично перетворить колекції в JSONмасиви. Gson може серіалізувати приватні поля та автоматично ігнорувати перехідні поля.


1
Примітка. Це не зберігає ключі з нульовими значеннями.
Вікас

58

Приклад використання json

Map<String, Object> data = new HashMap<String, Object>();
    data.put( "name", "Mars" );
    data.put( "age", 32 );
    data.put( "city", "NY" );
    JSONObject json = new JSONObject();
    json.putAll( data );
    System.out.printf( "JSON: %s", json.toString(2) );

вихід ::

JSON: {
  "age": 32,
  "name": "Mars",
  "city": "NY"
}

Ви також можете спробувати використовувати Google GSON.Google GSON - найкраща бібліотека для перетворення об’єктів Java в їх представлення JSON.

http://code.google.com/p/google-gson/


2
Вибачте за копання, але що робить 2у json.toString(2 ')
Джек

public String toString (int radix) .toString (2) використовується для представлення рядків. для більш stackoverflow.com/questions/3615721 / ...
Mohammod Хоссейн

11
який клас JSONObject це?
Янус Троельсен

18
Немає такого методу: (new org.json.JSONObject ()). PutAll ();
Зон

50

Ви можете конвертувати Mapв JSONвикористанні Jacksonнаступним чином :

Map<String,Object> map = new HashMap<>();
//You can convert any Object.
String[] value1 = new String[] { "value11", "value12", "value13" };
String[] value2 = new String[] { "value21", "value22", "value23" };
map.put("key1", value1);
map.put("key2", value2);
map.put("key3","string1");
map.put("key4","string2");

String json = new ObjectMapper().writeValueAsString(map);
System.out.println(json);

Maven залежності для Jackson:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.5.3</version>
    <scope>compile</scope>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.5.3</version>
    <scope>compile</scope>
</dependency>

Якщо ви використовуєте JSONObjectбібліотеку, ви можете перетворити карту JSONтаким чином:

Map<String, Object> map = new HashMap<>();
// Convert a map having list of values.
String[] value1 = new String[] { "value11", "value12", "value13" };
String[] value2 = new String[] { "value21", "value22", "value23" };
map.put("key1", value1);
map.put("key2", value2);

JSONObject json = new JSONObject(map);
System.out.println(json);

Maven залежності для JSONObject:

<dependency>
    <groupId>org.json</groupId>
    <artifactId>json</artifactId>
    <version>20140107</version>
</dependency>

Сподіваюсь, це допоможе. Щасливе кодування.


1
не знав, що я можу передати Карту як аргумент, дякую, дуже допоміг.
Гурха

@Gurkha Дякую за оцінку.
Анкур Махаджан

1
@AnkurMahajan +1 за правильну відповідь із залежністю :)
Badman

1
String json = новий ObjectMapper (). WriteValueAsString (map); Greate
Рохіт Лютра

7

У моєму випадку я не хотів ніяких залежностей. Використовуючи Java 8, ви можете отримати JSON як рядок такий простий:

Map<String, Object> map = new HashMap<>();
map.put("key", "value");
map.put("key2", "value2");
String json = "{"+map.entrySet().stream()
    .map(e -> "\""+ e.getKey() + "\"" + ":\"" + String.valueOf(e.getValue()) + "\"")
    .collect(Collectors.joining(", "))+"}";

2
ви не тікаєте ... якщо ключ або значення містяться ", це розривається
Янус Троельсен

ви праві, це рішення має певні обмеження, вкладені карти також не підтримуються
Андрій Сарул

7

Ви можете просто перерахувати карту та додати пари ключ-значення до JSONObject

Спосіб:

private JSONObject getJsonFromMap(Map<String, Object> map) throws JSONException {
    JSONObject jsonData = new JSONObject();
    for (String key : map.keySet()) {
        Object value = map.get(key);
        if (value instanceof Map<?, ?>) {
            value = getJsonFromMap((Map<String, Object>) value);
        }
        jsonData.put(key, value);
    }
    return jsonData;
}

1
жодних ярликів та ефективної роботи без додаткової бібліотеки
Maveň ツ

Map.Entry <K, V >> entrySet () призначений для ітерації карти. Читання ключів та пошук карти для кожного ключа - це неоптимальний спосіб.
Мартін

7

Підкреслювальна-java- бібліотека може конвертувати хеш-карту чи список масивів у json та vice verse.

import com.github.underscore.lodash.U;
import java.util.*;

public class Main {

    public static void main(String[] args) {

        Map<String, Object> map = new LinkedHashMap<>();
        map.put("1", "a");
        map.put("2", "b");

        System.out.println(U.toJson(map));
        // {
        //    "1": "a",
        //    "2": "b"
        // }
    }
}

5

Пізно на вечірку, але ось мій письменник adonc GSON для серіалізації хешмапу. Мені довелося записати карту пар ключів-значень як атрибутів рядка json, очікуючи, що один тип буде цілим числом. Я не хотів створювати власні оболонки JavaBean для цього простого використання.

Клас GSON JsonWriter - простий у використанні клас серіалізаторів, що містить декілька сильно набраних функцій write.value ().

// write Map as JSON document to http servlet response
Map<String,String> sd = DAO.getSD(123);
res.setContentType("application/json; charset=UTF-8");
res.setCharacterEncoding("UTF-8");
JsonWriter writer = new JsonWriter(new OutputStreamWriter(res.getOutputStream(), "UTF-8"));
writer.beginObject();
for(String key : sd.keySet()) {
    String val = sd.get(key);
    writer.name(key);
    if (key.equals("UniqueID") && val!=null)
        writer.value(Long.parseLong(val));
    else
        writer.value(val);
}
writer.endObject();
writer.close();

Якщо жоден зі спеціальних типів не потрібен, я міг би просто скористатися функцією toJson (). gson-2.2.4.jar бібліотека трохи менше 190 КБ без жорстоких залежностей. Легкий у використанні на будь-якому користувацькому додатку сервлетів або окремому додатку без великих інтеграцій рамок.

Gson gson = new Gson(); 
String json = gson.toJson(myMap); 

4

Зазвичай це робота бібліотеки Json, ви не повинні намагатися робити це самостійно. Усі бібліотеки json повинні реалізувати те, що ви просите, і ви можете знайти список бібліотек Java Json на json.org , внизу сторінки.


4

Я знайшов інший спосіб впоратися.

Map obj=new HashMap();    
obj.put("name","sonoo");    
obj.put("age",new Integer(27));    
obj.put("salary",new Double(600000));   
String jsonText = JSONValue.toJSONString(obj);  
System.out.print(jsonText);

Сподіваюсь, це допомагає.

Дякую.


3

Якщо вам потрібно, скористайтеся ним у коді.

Gson gsone = new Gson();
JsonObject res = gsone.toJsonTree(sqlParams).getAsJsonObject();

3

Для тих, хто використовує org.json.simple.JSONObject, ви можете перетворити карту в Json String і проаналізувати її, щоб отримати JSONObject.

JSONObject object = (JSONObject) new JSONParser().parse(JSONObject.toJSONString(map));

3

Краще запізнитися, ніж ніколи. Я використовував GSON для перетворення списку HashMap в рядок, якщо ви хочете мати серіалізований список.

List<HashMap<String, String>> list = new ArrayList<>();
HashMap<String,String> hashMap = new HashMap<>();
hashMap.add("key", "value");
hashMap.add("key", "value");
hashMap.add("key", "value");
list.add(hashMap);

String json = new Gson().toJson(list);

Це jsonвиробляє[{"key":"value","key":"value","key":"value"}]


Це не відповідає на запитання. Він створює масив JSON, а не об'єкт JSON. А ще хтось уже показав нам, як створити об’єкт JSON з хешмапу за допомогою Gson.
Стівен C

Привіт @StephenC, дехто може шукати приклад масиву JSON, а не JSON Object, оскільки верхній коментар уже дав найкращу відповідь. Я сподіваюся, що ми можемо надати інші відповіді, пов'язані з серіалізацією за допомогою GSON. Вибачте, цю відповідь слід розмістити на іншій темі.
Келлі Будол

Ми повинні писати відповіді для людей, які шукають належним чином. Якщо ми спробуємо задовольнити людей, які не можуть шукати, публікуючи відповіді поза темою, це погіршує сайт "шумом", а людям, які знають, як шукати відповіді , стає складніше . Якщо ви (зараз) погоджуєтесь, що ця відповідь не в тому місці, будь ласка, просто видаліть її.
Стівен C

1
@KellyBudol хороший чи поганий, твоя відповідь - це те, що я шукаю. Дякую Людина
vd

2

Ось однолінійне рішення з GSON:

myObject = new Gson().fromJson(new Gson().toJson(myHashMap), MyClass.class);

2

Це рішення працює зі складними JSON:

public Object toJSON(Object object) throws JSONException {
    if (object instanceof HashMap) {
        JSONObject json = new JSONObject();
        HashMap map = (HashMap) object;
        for (Object key : map.keySet()) {
            json.put(key.toString(), toJSON(map.get(key)));
        }
        return json;
    } else if (object instanceof Iterable) {
        JSONArray json = new JSONArray();
        for (Object value : ((Iterable) object)) {
            json.put(toJSON(value));
        }
        return json;
    }
    else {
        return object;
    }
}

2

ми використовуємо Gson.

Gson gson = new Gson();
Type gsonType = new TypeToken<HashMap>(){}.getType();
String gsonString = gson.toJson(elements,gsonType);

1

Можна використовувати XStream - це дуже зручно. Дивіться приклади тут

package com.thoughtworks.xstream.json.test;

import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver;

public class WriteTest {

    public static void main(String[] args) {

      HashMap<String,String> map = new HashMap<String,String>();
      map.add("1", "a");
      map.add("2", "b");
      XStream xstream = new XStream(new JettisonMappedXmlDriver());

      System.out.println(xstream.toXML(map));       

    }

}

Але ви повинні кешувати свій об’єкт xstream будь-хто
Joost

1

Якщо ви користуєтесь, net.sf.json.JSONObjectви не знайдете в ньому JSONObject(map)конструктора. Ви повинні використовувати public static JSONObject fromObject( Object object )метод. Цей метод приймає рядки у форматі JSON, Maps, DynaBeans та JavaBeans.

JSONObject jsonObject = JSONObject.fromObject(myMap);


1

Якщо ви використовуєте складні об'єкти, слід застосувати enableComplexMapKeySerialization () , як зазначено в https://stackoverflow.com/a/24635655/2914140 та https://stackoverflow.com/a/26374888/2914140 .

Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create();
Map<Point, String> original = new LinkedHashMap<Point, String>();
original.put(new Point(5, 6), "a");
original.put(new Point(8, 8), "b");
System.out.println(gson.toJson(original));

Вихід буде:

{
 "(5,6)": "a",
 "(8,8)": "b"
}

1

Немає необхідності в розборі бібліотек Gson або JSON. Просто використовуючи new JSONObject(Map<String, JSONObject>).toString(), наприклад:

/**
 * convert target map to JSON string
 *
 * @param map the target map
 * @return JSON string of the map
 */
@NonNull public String toJson(@NonNull Map<String, Target> map) {
    final Map<String, JSONObject> flatMap = new HashMap<>();
    for (String key : map.keySet()) {
        try {
            flatMap.put(key, toJsonObject(map.get(key)));
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
    try {
        // 2 indentSpaces for pretty printing
        return new JSONObject(flatMap).toString(2);
    } catch (JSONException e) {
        e.printStackTrace();
        return "{}";
    }
}

Проковтування винятків та повернення порожнього об’єкта - погана ідея.
Стівен C

1
    import org.json.JSONObject;

    HashMap<Object, Object> map = new HashMap<>();
    String[] list={"Grader","Participant"};
    String[] list1={"Assistant","intern"};
    map.put("TeachingAssistant",list);
    map.put("Writer",list1);
    JSONObject jsonObject = new JSONObject(map);
    System.out.printf(jsonObject.toString());

    // Result: {"TeachingAssistant":["Grader","Participant"],"Writer":["Assistant","intern"]}

Це лише повторення попередньої відповіді.
Стівен C

1

Якщо вам не потрібен HashMap, ви можете зробити щось подібне:

String jsonString = new JSONObject() {{
  put("firstName", user.firstName);
  put("lastName", user.lastName);
}}.toString();

Вихід:

{
  "firstName": "John",
  "lastName": "Doe"
}

Ну так. Однак питання запитує спосіб створення об’єкта JSON, починаючи з аHashMap , і це не відповідає на це.
Стівен C

Деякі люди могли приземлитися тут з Google, шукаючи загальне рішення. Наведена відповідь може допомогти їм.
Рафал

1

Я використовую Alibaba fastjson, легко і просто:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>VERSION_CODE</version>
</dependency>

і імпорт:

import com.alibaba.fastjson.JSON;

Тоді:

String text = JSON.toJSONString(obj); // serialize
VO vo = JSON.parseObject("{...}", VO.class); //unserialize

Все добре.


1

Якщо ви використовуєте JSR 374: API API для обробки JSON (javax json).

    JsonObjectBuilder job = Json.createObjectBuilder((Map<String, Object>) obj);
    JsonObject jsonObject = job.build();

0

Можна використовувати Gson . Ця бібліотека пропонує прості методи перетворення об’єктів Java в об'єкти JSON і навпаки.

Приклад:

GsonBuilder gb = new GsonBuilder();
Gson gson = gb.serializeNulls().create();
gson.toJson(object);

Ви можете використовувати GsonBuilder, коли потрібно встановити інші параметри конфігурації, ніж стандартні. У наведеному вище прикладі процес перетворення також буде серіалізувати нульові атрибути від об'єкта.

Однак такий підхід працює лише для непородних типів. Для загальних типів потрібно використовувати toJson (object, Type).

Більше інформації про Gson тут .

Пам'ятайте, що об'єкт повинен реалізувати інтерфейс Serializable .


0

це працює для мене:

import groovy.json.JsonBuilder
properties = new Properties()
properties.put("name", "zhangsan")

println new JsonBuilder(properties).toPrettyString()

1
Це не грубе питання.
Стівен C

@ stephen-c java - це платформа не просто мова, groovy - це просто баночка.
jiahut

Код у вашому запитанні не є Java. Якщо цей код справді працює для вас, ви не використовуєте Java. У Java немає заяви "println", і ви не можете оголосити подібну змінну. Я здогадуюсь, що ви використовуєте Groovy, але я не впевнений. Так чи інакше, рекомендуючи людям використовувати бібліотеки Groovy замість бібліотек Java в коді Java ... не дуже гарна ідея.
Стівен С

0

Шлях Gson для трохи складніших карт і списків за допомогою методу TypeToken.getParameterized :

У нас є карта, яка виглядає приблизно так:

Map<Long, List<NewFile>> map;

Ми отримуємо Тип за допомогою вищезгаданого методу getParameterized таким чином:

Type listOfNewFiles = TypeToken.getParameterized(ArrayList.class, NewFile.class).getType();
Type mapOfList = TypeToken.getParameterized(LinkedHashMap.class, Long.class, listOfNewFiles).getType();

А потім використовуйте об’єкт Gson fromJson подібним методом, використовуючи такий об'єкт mapOfList :

Map<Long, List<NewFile>> map = new Gson().fromJson(fileContent, mapOfList);

Згаданий об'єкт NewFile виглядає приблизно так:

class NewFile
{
    private long id;
    private String fileName;

    public void setId(final long id)
    {
        this.id = id;
    }

    public void setFileName(final String fileName)
    {
        this.fileName = fileName;
    }
}

Десеріалізований JSON виглядає приблизно так:

{
  "1": [
    {
      "id": 12232,
      "fileName": "test.html"
    },
    {
      "id": 12233,
      "fileName": "file.txt"
    },
    {
      "id": 12234,
      "fileName": "obj.json"
    }
  ],
 "2": [
    {
      "id": 122321,
      "fileName": "test2.html"
    },
    {
      "id": 122332,
      "fileName": "file2.txt"
    },
    {
      "id": 122343,
      "fileName": "obj2.json"
    }
  ]
}


-1

Я зіткнувся з подібною проблемою, коли десеріалізував Відповідь з користувацьких команд у селені. Відповідь була json, але селен внутрішньо перекладає це на java.util.HashMap [String, Object]

Якщо ви знайомі з scala та використовуєте API для відтворення для JSON, ви можете скористатися цим:

import play.api.libs.json.{JsValue, Json}
import scala.collection.JavaConversions.mapAsScalaMap


object JsonParser {

  def parse(map: Map[String, Any]): JsValue = {
    val values = for((key, value) <- map) yield {
      value match {
        case m: java.util.Map[String, _] @unchecked => Json.obj(key -> parse(m.toMap))
        case m: Map[String, _] @unchecked => Json.obj(key -> parse(m))
        case int: Int => Json.obj(key -> int)
        case str: String => Json.obj(key -> str)
        case bool: Boolean => Json.obj(key -> bool)
      }
    }

    values.foldLeft(Json.obj())((temp, obj) => {
      temp.deepMerge(obj)
    })
  }
}

Опис невеликого коду:

Код рекурсивно проходить через HashMap, поки не будуть знайдені основні типи (String, Integer, Boolean). Ці основні типи можна безпосередньо загорнути у JsObject. Коли рекурсія розгортається, глибинне об'єднання об'єднує створені об'єкти.

"@uncked" піклується про попередження про стирання типу.


Це не питання Scala
Stephen C

-1

Спочатку конвертуйте всі об'єкти у дійсні рядки

HashMap<String, String> params = new HashMap<>();
params.put("arg1", "<b>some text</b>");
params.put("arg2", someObject.toString());

Потім вставити всю карту в org.json.JSONObject

JSONObject postData = new JSONObject(params);

Тепер ви можете отримати JSON, просто зателефонувавши в об'єкт toString

postData.toString()
//{"arg1":"<b>some text<\/b>" "arg2":"object output"}

Створіть новий JSONObject

JSONObject o = new JSONObject(postData.toString());

Або як байтовий масив для надсилання через HTTP

postData.toString().getBytes("UTF-8");

Це те саме, що і попередні відповіді років тому, без переваги бути стислим.
Стівен C

@StephenC Я поняття не маю, про що ти
йдеш

@StephenC "Як перетворити або передати хешмап в об'єкт JSON на Java, і знову перетворити об'єкт JSON в рядок JSON?"
G_V

362 людини (і порахували) думають, що stackoverflow.com/a/12155874/139985 відповідає на питання. В основному це говорить те, що йдеться у вашій відповіді без надмірних шматочків.
Стівен C
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.