Как конвертировать JAVA-объект в JSON Эффективно ..? - PullRequest
2 голосов
/ 15 марта 2012

Я использую Мул .У меня есть объект JAVA, который заполняется из моего внутреннего класса. На самом деле это HashMap<String,Object>.Object может быть чем угодно .. другим HashMap, ИЛИ List и т. Д. Теперь мне нужно преобразовать его в JSON (и удалить все те ключи, которые имеют значение NULL) ..

Когда я использую данный Mule Transformer, ObjectToJSON, он конвертируется в соответствующий JSON .. но не может удалить значение NULL .. И я не могу найти какие-либо свойства для установки в Custom-transformer , которые будутудалить значения NULL .. !!


Итак, я написал специальный преобразователь , который использует библиотеку net.sf.json-lib, и я могу удалить значения NULL.

Но в одном из моих объектов JAVA у меня есть HashMap<Integer,String>, и поскольку в объекте JSON Integer не может быть ключами, net.sf.json библиотека дает исключение:

Exception stack is:
1. JSON keys must be strings. (java.lang.ClassCastException)
  net.sf.json.JSONObject:1120 (null)
2. java.lang.ClassCastException: JSON keys must be strings. (net.sf.json.JSONException)
  net.sf.json.JSONObject:1160 (null)
3. java.lang.ClassCastException: JSON keys must be strings. (net.sf.json.JSONException). Message payload is of type: HashMap (org.mule.api.transformer.TransformerMessagingException)

ипоэтому он не может преобразовать его в JSON ..


Так какой же самый жизнеспособный вариант .. ??

Ответы [ 3 ]

8 голосов
/ 15 марта 2012

Я бы порекомендовал вам попробовать gson это сработало как волшебство для меня.

Примеры коллекций

Gson gson = new Gson();
Collection<Integer> ints = Lists.immutableList(1,2,3,4,5);

(сериализации)

String json = gson.toJson(ints); ==> json is [1,2,3,4,5]

(десериализация)

Type collectionType = new TypeToken<Collection<Integer>>(){}.getType();
Collection<Integer> ints2 = gson.fromJson(json, collectionType);

ints2 - это то же самое, что и ints

Вот пример того, как написать собственный сериализатор для класса JodaTime DateTime.

private class DateTimeSerializer implements JsonSerializer<DateTime> {
  public JsonElement serialize(DateTime src, Type typeOfSrc, JsonSerializationContext  context) {
    return new JsonPrimitive(src.toString());
  }
}
1 голос
/ 15 марта 2012
0 голосов
/ 10 февраля 2014

С http://www.ietf.org/rfc/rfc4627.txt

Структура объекта представляется в виде пары фигурных скобок, окружающих ноль или более пар имя / значение (или членов). Имя - это строка.

Я бы предложил изменить исходную структуру Java для использования String в качестве типа ключа.

Однако с библиотекой Джексона вы можете создавать более причудливые решения:

  1. Использование пользовательского десериализатора Десериализация ключей нестроковой карты с Джексоном

  2. Используйте древовидную модель вместо собственного Java POJO http://wiki.fasterxml.com/JacksonInFiveMinutes

...