如何在Java中使用GSON将JSON对象的映射转换为JSON?

时间:2014-01-21 02:26:00

标签: java json hashmap gson

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

4 个答案:

答案 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通过将每个字段值映射到字段名称来序列化您的对象。


  

Listen to this man.

     

And this one.

答案 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 processingJ2EE的标准实现。

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"
        }
    }
}