【问题标题】:How to convert JAVA Object to JSON Efficiently..?如何有效地将 JAVA 对象转换为 JSON..?
【发布时间】:2014-02-11 01:23:47
【问题描述】:

我正在使用 Mule。我有一个从我的内部类填充的 JAVA 对象。它实际上是一个HashMap<String,Object>Object 可以是任何东西..另一个HashMap,或List 等..现在我必须将其转换为JSON(并删除所有那些值为NULL的键)..

当我使用给定的 Mule Transformer ObjectToJSON 时,它正在转换为适当的 JSON..但无法删除 NULL 值..而且我找不到任何要在 Custom-transformer 中设置的属性 strong> 将删除 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..


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

【问题讨论】:

  • 如果 JSON 不允许键是数字,可以用 _ 开始你的键,例如` { _1:你好,_9:世界} `
  • 不..我已经制作了我的 JAVA 代码..我无法对其进行更改..其次,我必须将 Integer 提供给我的前端 APP..(尽管它可以是 Integer像“1”这样的字符串)..!!..请建议该怎么做..!!

标签: java json mule transformer


【解决方案1】:

我建议你试试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());
  }
}

【讨论】:

  • 我看过它,我发现了两个问题...首先,它不会将子对象转换为 JSON 其次,我无法解析日期时间 .. setDateFormat 属性在 gson 中不起作用.. 它报告了 gson 库中的错误..!!
  • @RamandeepSingh,什么是“子对象”?日期问题在最近的版本中已修复,无论如何您都可以编写自己的反序列化器 - 请参阅我的编辑。
  • subObjects :我有HashMap&lt;String,Object&gt; ..现在Object 可以是另一个HashMap&lt;String,Object&gt; 将被视为SubObject ..!!
  • 那么为什么首先要使用原始类型呢?顺便说一句,您可以编写自己的反序列化程序来检查类型并正确处理复杂类型。
  • 嗯,我无法想象证明这种复杂层次结构合理性的问题。也许您可以详细说明您要做什么?无论如何,我建议您考虑重新设计:)
【解决方案2】:

【讨论】:

  • 查看我的评论以获取其他建议 gson ..!!
【解决方案3】:

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

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

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

但是,使用 Jackson 库,您可以创建更出色的解​​决方案:

  1. 使用自定义解串器Deserializing non-string map keys with Jackson

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

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多