我有一个JSON对象的地图如下:
Map<String,Object> map = HashMap<String,Object>();
map.put("first_name", "prod");
JSONObject jsonObj = new JSONObject("some complex json string here");
map.put("data", jsonObj);
Gson gson = new Gson();
String result = gson.toJson(map);
现在,如果“这里的一些复杂JSON字符串”是:
{"sender":{"id":"test test"},"recipients":{"id":"test1 test1"} }
并执行上面的代码给了我类似的东西:
{
"first_name": "prod",
"data": {
"map": {
"sender": {
"map": {
"id": "test test"
}
}
},
"recipients": {
"map": {
"id": "test1 test1"
}
}
}
}
}
我可能有一些语法错误,但基本上我不知道为什么我会看到围绕map
的对象。
更新
根据评论,混合不同的json解析器是个坏主意。我可以理解。但我的情况需要调用一个外部api,该api获取最终使用gson反序列化的对象的哈希映射。
是否有任何其他对象床边JSONObject,我可以添加到地图,仍然有gson创建json出来,没有额外的地图结构?我知道我可以创建java豆并实现这一点。
更新2
退一步说,我得到了一个xml字符串。我已经将它们转换为json对象。现在我必须使用一个外部api来获取一个映射,该映射反过来又使用外部服务中的gson转换为json字符串。
所以我得到了一个xml数据结构,但我需要传递一个映射到那个函数。我上面描述的方式在使用gson转换为json字符串时会产生额外的'map'结构。我没有控制来改变外部服务的行为方式(例如使用gson转换地图)。
混合来自两个不同JSON库的类只会以眼泪告终。这就是你的问题;JSONObject
不是Gson的一部分。此外,尝试将Java数据结构与库的解析树表示混合也是一个坏主意;从概念上讲,JSON中的对象是一个映射。
如果你要使用Gson,要么使用所有Java对象并让Gson转换它们,要么使用Gson中的类:
JsonObject root = new JsonObject();
root.addProperty("first_name", "prod");
JsonElement element = new JsonParser().parse(complexJsonString);
root.addProperty("data", element);
String json = new Gson().toJson(root);
这与JSONObject
的内部实现有关。类本身有一个类型为java.util.Map
的实例字段,名称为map
。
当你解析String
时
{"sender":{"id":"test test"},"recipients":{"id":"test1 test1"} }
使用JSONObject
,您实际上有1个rootJSONObject
,两个嵌套的JSONObject
,一个名为sender
,一个名为收件人
。
等级制度基本上是这样的
JSONObject.map ->
"sender" ->
JSONObject.map ->
"id" -> "test test",
"recipients" ->
JSONObject.map ->
"id" -> "test test1"
Gson通过将每个字段值映射到字段名称来序列化您的对象。
听听这个人。
还有这个。
我遇到了一个类似的问题,我最终使用json-简单解决了它。
HashMap<String, Object> object = new HashMap<String,Object>;
// Add some values ...
// And finally convert it
String objectStr = JSONValue.toJSONString(object);