Существует ли десериализатор Java JSON, который декодирует строку в словарь списков или списков словарей примитивных типов - PullRequest
1 голос
/ 10 декабря 2010

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

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

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

Ответы [ 4 ]

6 голосов
/ 10 декабря 2010

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

Например, с Джексоном вы бы сделали:

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);

Дополнительные примеры вы можете посмотреть в Учебник Джексона .

5 голосов
/ 10 декабря 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 легкодерево, использующее эти объекты.

1 голос
/ 23 сентября 2015

Flexjson определенно делает это.В следующей строке десериализация jsonString в HashMap

Map<String, String> map = new flexjson.JSONDeserializer().deserialize(jsonString);
0 голосов
/ 10 декабря 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...