Как преобразовать hashmap в объект JSON в Java

288

Как преобразовать или преобразовать hashmap в объект JSON в Java и снова преобразовать объект JSON в строку JSON?

мохан
источник

Ответы:

436

Ты можешь использовать:

new JSONObject(map);

Внимание: это будет работать только дляMap<String, String>!

Другие функции вы можете получить из его документации
http://stleary.github.io/JSON-java/index.html

Анкур
источник
85
Это работает только для String, String map, а не для сложного String, Object.
slott
2
Вы помещаете Mapв JSONObjectно как вы можете получить эту карту от JSONObject?
Юбарай
1
@ Юби, это может вам помочь: stackoverflow.com/questions/21720759/convert-jsonobject-to-map
Ханнун Ясир
8
@slott подходит для более старых версий. Более новые версии, такие как kitkat, прекрасно работают с более сложными объектами, такими как HashMap <String, Object> (), содержащим HashMap <String, Object> () в качестве объекта. Поэтому я рекомендую Gson.
Луисми
Я просто искал это
Навид Ахмад
170

Gson также может быть использован для сериализации произвольно сложных объектов.

Вот как вы используете это:

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

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

Rama
источник
1
Примечание. При этом ключи с нулевыми значениями не сохраняются.
Викас
59

Пример использования 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"
}

Вы также можете попробовать использовать GSON от Google. GSON от Google - лучшая библиотека для преобразования объектов Java в их представление JSON.

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

Мохаммод Хоссейн
источник
2
Извините за раскопки, но что 2делать в json.toString(2`)
Джек,
public String toString (int radix) .toString (2) используется для представления String. для более stackoverflow.com/questions/3615721/…
Мохаммод Хоссейн
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
не знал, что могу передать Map в качестве аргумента, спасибо, очень помог.
гуркхов
@Gurkha Спасибо за оценку.
Анкур Махаджан
1
@AnkurMahajan +1 за правильный ответ с зависимостью :)
Badman
1
String json = new ObjectMapper (). WriteValueAsString (map); Грейт
Рохит Лутра
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;
}
UnahD
источник
1
нет ярлыков и работает эффективно без какой-либо дополнительной библиотеки
Maveň ツ
Элемент Map.Entry <K, V >> entrySet () предназначен для итерации карты. Чтение ключей и поиск карты для каждого ключа является неоптимальным способом.
Мартин
7

Библиотека Underscore-java может конвертировать хэш-карту или список массивов в json и наоборот.

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

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

Класс GSON JsonWriter - это простой в использовании класс сериализатора, содержащий несколько строго типизированных функций writer.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); 
Whome
источник
4

Обычно это работа библиотеки Json, вам не следует пытаться делать это самостоятельно. Все библиотеки json должны реализовывать то, что вы просите, и вы можете найти список библиотек Java Json на json.org , внизу страницы.

jolivier
источник
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);

Надеюсь это поможет.

Спасибо.

IMJS
источник
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));
shark1608
источник
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 из hashmap, используя Gson.
Стивен C
Привет @StephenC, некоторые могут искать пример массива JSON, а не JSON Object, так как верхний комментарий уже дал лучший ответ на данный момент. Я надеюсь, что мы можем дать другие ответы, связанные с сериализацией с использованием GSON. Мои извинения, этот ответ должен быть опубликован в другой ветке.
Келли Будол
Мы должны писать ответы для людей, которые ищут правильно. Если мы пытаемся обслуживать людей, которые не могут искать, публикуя ответы, не относящиеся к теме, это снижает уровень шума сайта и усложняет задачу людям, которые знают, как искать, чтобы найти релевантные ответы. Если вы (сейчас) согласны с тем, что этот ответ находится не в том месте, просто удалите его.
Стивен С
1
@ KellyBudol, хорошо или плохо, твой ответ - то, что я ищу. Спасибо, мужчина
vd
2

Вот мое однолинейное решение с GSON:

myObject = new Gson().fromJson(new Gson().toJson(myHashMap), MyClass.class);
Alecs
источник
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;
    }
}
RiccardoCh
источник
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));       

    }

}
Aviad
источник
Но вы должны кэшировать свой объект xstream любому
Joost
1

Если вы используете, net.sf.json.JSONObjectто вы не найдете в нем JSONObject(map)конструктор. Вы должны использовать public static JSONObject fromObject( Object object )метод. Этот метод принимает строки в формате JSON, Maps, DynaBeans и JavaBeans.

JSONObject jsonObject = JSONObject.fromObject(myMap);

Zeeshan
источник
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"
}
CoolMind
источник
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 "{}";
    }
}
drakeet
источник
Глотать исключения и возвращать пустой объект - плохая идея.
Стивен С
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"]}
Пушья
источник
Это просто повторение более раннего ответа.
Стивен С
1

Если вам не нужен HashMap, вы можете сделать что-то вроде этого:

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

Вывод:

{
  "firstName": "John",
  "lastName": "Doe"
}
Рафаль Энден
источник
Ну да. Тем не менее, вопрос требует способа создания объекта JSON, начиная с aHashMap , и это не дает ответа.
Стивен С.
Некоторые люди могут приземлиться здесь из 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: Java 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()
jiahut
источник
1
Это не Groovy вопрос.
Стивен С
@ stephen-c java - это платформа, а не просто язык, groovy - это просто баночка.
19
Код в вашем вопросе не 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 из метода Json, как этот, используя объект 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 и используете play-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. Когда рекурсия развернута, deepmerge объединяет созданные объекты.

@unchecked заботится о предупреждениях стирания типов.

Амрас
источник
Это не вопрос Скала
Стивен 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");
G_v
источник
Это говорит о том же, что и предыдущие ответы много лет назад, без преимущества краткости.
Стивен С
@StephenC Я понятия не имею, о чем ты
G_V
@StephenC "Как преобразовать или преобразовать hashmap в объект JSON в Java и снова преобразовать объект JSON в строку JSON?"
G_V
362 человека (и их количество) считают, что stackoverflow.com/a/12155874/139985 отвечает на вопрос. Это говорит в основном то, что говорит ваш ответ без вычурных кусочков.
Стивен С