Есть ли десериализатор Java JSON, который декодирует строку в словарь списков или списков словарей примитивных типов

Мне нужно извлечь из базы данных документы JSON, которые не основаны на стандартном объекте.

Есть ли способ использовать JAVA для "десериализации" этих документов в списки и словари примитивных объектов (строка, int, bool и т.д...)

Любая библиотека, которая может делать это в обоих направлениях? Другими словами, я ищу аналог Java для System.Runtime.Serialization.Json.


person ada    schedule 09.12.2010    source источник
comment
Да. Для этого есть ряд библиотек (см. json.org). Большинство из них имеют дело с некоторыми внутренними объектами, которые эквивалентны List и Map, чтобы упростить работу с динамическим характером типов в структуре. (Иметь дело с HashMap<String,Object> не очень весело.)   -  person    schedule 10.12.2010


Ответы (4)


Почти каждая библиотека Java на http://json.org/ может сделать это, вы действительно пытались что-то найти?

Например, с Jackson вы должны сделать следующее:

ObjectMapper mapper = new ObjectMapper();
Map<String,Object> map = mapper.readValue(json, Map.class);

но часто удобно создавать свои собственные объекты Java для сопоставления; нет необходимости использовать стандартные объекты. Например:

  public class MyType {
    public String name;
    public int age;
    // and so on
    public Date createTime;
  }

  MyType instance = mapper.readValue(json, MyType.class);

Дополнительные примеры можно найти в руководстве по Джексону.

person StaxMan    schedule 10.12.2010

Вместо того, чтобы пытаться превратить JSON в сложный в использовании Map<String, Object> или List<Object>, я бы порекомендовал библиотеку, которая может анализировать JSON в древовидной модели. Многие библиотеки могут делать такие вещи, но мне больше всего нравится Google Gson. Вы можете использовать его класс JsonParser для анализа JSON как дерева, начинающегося с корня JsonElement. Если у вас есть JsonElement, пользоваться им должно быть значительно проще, чем некоторыми Object, которые могут быть List, а могут быть Map.

JsonElement e = new JsonParser().parse(someJson);
if (e.isJsonObject()) {
  // JsonObject has many of the same methods as a Map
  JsonObject obj = e.getAsJsonObject();
  String foo = obj.get("foo").getAsString();
  int bar = obj.get("bar").getAsInt();
} else if (e.isJsonArray()) {
  JsonArray array = e.getAsJsonArray();
  // JsonArray implements Iterable and can be used a lot like a List
  for (JsonElement element : array) {
    ...
  }
}

С помощью этих объектов также легко построить дерево JSON.

person ColinD    schedule 09.12.2010

Flexjson определенно делает это. Строка ниже десериализует jsonString в HashMap.

Map<String, String> map = new flexjson.JSONDeserializer().deserialize(jsonString);
person Aneesh Vijendran    schedule 23.09.2015

Извините, но в JSON нет никакой метаинформации о типах данных, поэтому нет возможности преобразовать что-либо обратно, не основанное на стандартных объектах, кроме списка строк.

ОБНОВЛЕНИЕ: я мог подумать о создании POGO с Groovy из неклассифицированной строки JSON. Затем вы также можете работать с динамическими объектами. Возможно, вы также можете использовать http://json-lib.sourceforge.net/.

person Christian    schedule 09.12.2010
comment
Я понимаю, что JSON поддерживает только несколько типов без метаинформации. Что мне нужно от строки JSON, так это просто вложенные словари и списки. Мне нужен последний уровень вложенности как строки предпочтительно. - person ada; 10.12.2010
comment
Голосование против без комментария является грубым. Если что-то не так, сначала следует дать подсказку. - person Christian; 17.03.2016
comment
Вас заминусовали за то, что вы дали неверный совет. Существует множество библиотек json, которые можно десериализовать в более сложные определения типов. - person Shayne; 19.04.2016
comment
Действительно. Какие, без добавления дополнительных полей для метаинформации? И, в конце концов, речь идет о строках, числах, логических значениях и их массивах. Таким образом, десериализация Json предполагает, какой тип десериализовать. - person Christian; 21.04.2016