如何高效地将Java对象转换为JSON?

3
我正在使用Mule。 我有一个从我的内部类填充的JAVA对象。实际上是一个HashMap。 Object可以是任何东西..另一个HashMap、List等。现在我必须将它转换为JSON(并删除所有其值为NULL的键)。
当我使用给定的Mule转换器ObjectToJSON时,它会转换为适当的JSON..但无法删除NULL值。而且我找不到在自定义转换器中设置将删除NULL值的属性..!!
所以,然后我编写了一个自定义转换器,该转换器使用net.sf.json-lib库,我可以删除NULL值。
但是在我的JAVA对象之一中,我有一个HashMap,因为在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: 世界 } - Peter Lawrey
不,我已经编写了我的JAVA代码,并且无法对其进行更改。其次,我必须将整数提供给我的前端应用程序(尽管它可以是类似于“1”的整数字符串)。请建议该怎么做。 - Ramandeep Singh
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]

反序列化(Deserialization)
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());
  }
}

我已经查看了它,发现两个问题...首先,它不能将SubObjects转换为JSON。其次,我无法解析Datetime。在gson中,setDateFormat属性不起作用。这是gson库中报告的错误..!! - Ramandeep Singh
@RamandeepSingh,'SubObject'是什么?日期问题已在最近的版本中修复,无论如何,您都可以编写自己的de/serializer-请参阅我的编辑。 - aviad
那么为什么首先要使用原始类型呢?顺便说一下,您可以编写自己的序列化程序/反序列化程序,检查类型并正确处理复杂类型。 - aviad
好的,你的代码无法将值解释为HashMap<String,Object>类型,因为Gson调用list.getClass()来获取其类信息,但是该方法返回原始类HashMap<String,Object>().class。这意味着Gson无法知道这是HashMap<String,Object>类型的对象,而不仅仅是普通的HashMap。您可以通过为泛型类型指定正确的参数化类型来解决此问题。您可以使用TypeToken类来实现这一点。 - aviad
1
我无法想象出需要如此复杂层级的问题。也许您可以详细说明一下您想要做什么?无论如何,我建议您考虑重新设计 :) - aviad
显示剩余3条评论

1

看看我的评论,建议使用 gson..!! - Ramandeep Singh

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接