【问题标题】:How to convert map of JSON objects to JSON using GSON in Java?如何在 Java 中使用 GSON 将 JSON 对象的映射转换为 JSON?
【发布时间】:2014-02-10 10:46:38
【问题描述】:

我有一个 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 周围。

更新

根据 cmets,混合不同的 json 解析器是个坏主意。 我能理解。但我的情况需要调用一个外部 api,它采用最终使用 gson 反序列化的对象的哈希映射。

是否有任何其他对象床边 JSONObject 我可以添加到地图中,并且仍然让 gson 在没有额外“地图”结构的情况下从中创建 json?我明白我可以创建 java bean 并实现这一点。但我正在寻找一种更简单的方法,因为我的数据结构可能很复杂。

更新2

退一步,我得到了一个 xml 字符串。我已经将它们转换为 json 对象。 现在我必须使用一个外部 api 来获取一个地图,然后在外部服务中使用 gson 将其转换为 json 字符串。

所以我得到了一个 xml 数据结构,但我需要将映射传递给该函数。当使用 gson 转换为 json 字符串时,我上面描述的方式会产生额外的“地图”结构。我无法控制更改外部服务的行为方式(例如,使用 gson 转换地图)。

【问题讨论】:

  • 混合来自两个不同 JSON 解析库的类是灾难的根源。
  • 您必须向我们提供HashMap 内容的示例以及您要添加的内容。不清楚你到底想要什么。
  • 我正在尝试创建一个哈希图,以后可以使用 gson 将其转换为 json 字符串。但出于我的需要,我需要创建该地图,而不是 json 字符串。我只需要知道这张地图“可以”使用 gson 转换为 json 字符串,并带有额外的“地图”

标签: java json hashmap gson


【解决方案1】:

您可以尝试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"
        }
    }
}

【讨论】:

    【解决方案2】:

    我也遇到过类似的问题,我终于用json-simple 解决了。

    HashMap<String, Object> object = new HashMap<String,Object>;
    
    // Add some values ...
    
    // And finally convert it
    String objectStr = JSONValue.toJSONString(object);
    

    【讨论】:

      【解决方案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);
      

      【讨论】:

      • 虽然这是一个很好的解决方案,但我需要一个可以使用 gson 成功转换为 json 字符串的对象哈希图,而无需额外的 'map's 包装器
      • 再次,然后使用 Java 类,而不是从解析器解析树类。目前尚不清楚您现在要问的是什么,因为上面的内容正是您说您想要的。
      • 要明确:您要么使用解析树对象,然后从树中生成 JSON,要么使用 Java 类并让 Gson 将它们序列化为 JSON。您可以使用Gson.toJsonTree()从任何Map 轻松生成JsonElement
      • 我正在尝试创建一个哈希图(可以通过其他一些外部进程使用 gson 将其转换为 json 字符串)。所以基本上我想创建这样一个哈希图,而不是不同的数据结构。
      【解决方案4】:

      这与JSONObject 的内部实现有关。类本身有一个类型为java.util.Map 的实例字段,名称为map

      当你解析String

      {"sender":{"id":"test test"},"recipients":{"id":"test1 test1"} }
      

      使用JSONObject,您实际上有1 个根JSONObject、两个嵌套的JSONObjects、一个名称为sender 和一个名称为recipients

      层次结构基本是这样的

      JSONObject.map ->
          "sender" -> 
                  JSONObject.map ->
                          "id" -> "test test",
          "recipients" ->
                  JSONObject.map ->
                          "id" -> "test test1"
      

      Gson 通过将每个字段值映射到字段名称来序列化您的对象。


      Listen to this man.

      And this one.

      【讨论】:

      • 换句话说,不要混合使用 JSON 工具包。
      猜你喜欢
      • 1970-01-01
      • 2011-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多