提问者:小点点

如何转换地图的JSON对象JSON使用GSON在Java?


我有一个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转换地图)。


共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);

匿名用户

这与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);