我有一个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,它接受最终使用gson反序列化的对象的哈希映射。
是否有任何其他对象床边JSONObject,我可以添加到地图,仍然有gson创建json没有额外的'地图'结构?我明白我可以创建java bean并实现这一点。但我正在寻找一种更简单的方法,因为我的数据结构可能很复杂。
UPDATE2
退一步,给我一个xml字符串。我已将它们转换为json对象。 现在我必须使用一个外部api,它使用一个映射,然后在外部服务中使用gson将其转换为json字符串。所以我给了一个xml数据结构,但我需要将一个映射传递给该函数。我在上面描述的方式在使用gson转换为json字符串时会产生额外的'map'结构。我无法控制外部服务的行为(例如使用gson转换地图)。
答案 0 :(得分:3)
这与JSONObject
的内部实施有关。该类本身具有类型为java.util.Map
的实例字段,其名称为map
。
解析String
{"sender":{"id":"test test"},"recipients":{"id":"test1 test1"} }
JSONObject
,实际上有1个根JSONObject
,两个嵌套JSONObject
,一个名称为sender
,另一个名称为recipients
。
层次结构基本上是这样的
JSONObject.map ->
"sender" ->
JSONObject.map ->
"id" -> "test test",
"recipients" ->
JSONObject.map ->
"id" -> "test test1"
Gson通过将每个字段值映射到字段名称来序列化您的对象。
答案 1 :(得分:3)
混合来自两个不同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);
答案 2 :(得分:3)
我遇到了类似的问题,最后我使用json-simple解决了这个问题。
HashMap<String, Object> object = new HashMap<String,Object>;
// Add some values ...
// And finally convert it
String objectStr = JSONValue.toJSONString(object);
答案 3 :(得分:0)
您可以尝试Java API for JSON processing的J2EE的标准实现。
JsonObject obj = Json
.createObjectBuilder()
.add("first_name", "prod")
.add("data", Json.createObjectBuilder()
.add("sender", Json.createObjectBuilder().add("id", "test test"))
.add("recipients", Json.createObjectBuilder().add("id", "test1 test1"))).build();
Map<String, Object> prop = new HashMap<String, Object>() {
{
put(JsonGenerator.PRETTY_PRINTING, true);
}
};
JsonWriter writer = Json.createWriterFactory(prop).createWriter(System.out);
writer.writeObject(obj);
writer.close();
输出应为:
{
"first_name":"prod",
"data":{
"sender":{
"id":"test test"
},
"recipients":{
"id":"test1 test1"
}
}
}