3

我正在使用骡子。我有一个从我的内部类填充的 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 对象中,整数不能是键,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 ..


那么什么是最可行的选择..??

4

3 回答 3

8

我建议您尝试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());
  }
}
于 2012-03-15T13:04:07.097 回答
1

你看过格森吗?

http://sites.google.com/site/gson/gson-user-guide#TOC-Null-Object-Support

于 2012-03-15T13:03:14.227 回答
0

来自http://www.ietf.org/rfc/rfc4627.txt

对象结构表示为一对围绕零个或多个名称/值对(或成员)的花括号。名称是一个字符串。

我建议修改您的初始 Java 结构以使用 String 作为键类型。

但是,使用 Jackson 库,您可以创建更高级的解决方案:

  1. 使用自定义反序列化器使用 Jackson 反序列化非字符串映射键

  2. 使用树模型而不是您自己的 Java POJO http://wiki.fasterxml.com/JacksonInFiveMinutes

于 2014-02-10T17:23:47.673 回答