【问题标题】:Convert jsonobject to string by using gson issue使用 gson 问题将 jsonobject 转换为字符串
【发布时间】:2019-11-01 19:57:11
【问题描述】:

我正在尝试使用 GSON 库将 JsonObject 转换为 String。但结果输出将多一层父“地图”包裹 json。请让我知道我做错了什么,为什么会出现父“地图”层?

我什至尝试使用 new Gson().toJson(bean); 来隐藏 bean;但输出结果还有一层父“地图”包裹了json。

使用需要满足的条件

1) Mutable object
2) GSON
3) method might handle other object Type

使用波纹管库的 Maven 项目:

<dependency>
  <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.5</version>
</dependency>

Java 代码如下(示例仅供理解不是真正的代码,将在 T 中使用):

List<JSONObject> records = new ArrayList <JSONObject> ();           
JSONObject bean = new JSONObject();

bean.put("A", "is A");    
bean.put("B", "is B lah");    
bean.put("C", "is C lah");    
bean.put("D", "is D");    

records.add(bean);

String JSONBody2 = new Gson().toJson(records);

我希望输出是 [{"D":"is D","A":"is A","B":"is B lah","C":"is C lah"}]

但实际输出是 [{"map":{"D":"is D","A":"is A","B":"is B lah","C":"is C lah"}}]

实际代码如下

public String Json( String json, List<T>  list) {
   String JSONBody = new Gson().toJson(list);
}

我需要使用 gson 进行序列化,这就是我放 T 的原因。但我不知道为什么“地图”会出现在这里。和以前一样,它可以在没有父“地图”包装的情况下工作。 (相同的代码和相同的库只是新重新创建的项目,但有这个问题)

【问题讨论】:

  • 使用JSONArray 而不是List&lt;JSONObject&gt;
  • 使用 JsonArray 代替 gson ,使用 toString() 方法转成字符串
  • @SudhirOjha 更喜欢可变对象。
  • @MuhammadAhmed 需要使用 GSON 来处理其他类型的对象

标签: java json gson


【解决方案1】:

使用 JSONArray 而不是 List ,它会给你想要的输出:

JSONArray  records = new JSONArray();           
JSONObject bean = new JSONObject();

bean.put("A", "is A");
bean.put("B", "is B lah");    
bean.put("C", "is C lah");    
bean.put("D", "is D");    

records.put(bean);

String JSONBody2 = new Gson().toJson(records);

【讨论】:

  • 在您的帖子中,您使用的是“ArrayList ”而不是“new JSONArray()”,这实际上解决了您的问题:)
  • @nica 是的,您只需将 records 数据结构从 Arraylist 更改为 JSONArray ,第一行代码是更改,请查看
  • 更喜欢使用 ArrayList 而不是 JSONArray 加上我会使用 T 因为有时必须处理不同类型的对象。
【解决方案2】:

试试

  String JSONBody2 = record.toString());

会给你 [{"A":"is A","B":"is B lah","C":"is C lah","D":"is D"}]

你可以通过这个链接https://stackoverflow.com/a/27893392/4500099更好地理解类型转换

【讨论】:

    【解决方案3】:

    虽然其他人已经回答了这个问题,但我想强调一项重要的学习。有两种方法可以将 JsonObject 转换为字符串。 一个是new Gson().toJson(..),另一个是JsonObject.toString()

    虽然在很多情况下两者都会产生相同的结果,但是如果 JsonObject 有一些包含有效 url 或 base64 编码值的字符串字段,第一种方法会将 &amp;= 转换为相应的 utf-8 代表字符,这将使您的 url 和 base64 编码值已损坏。但是,第二种方法保持这些值不变。

    【讨论】:

      【解决方案4】:

      不要使用 JSON 对象。只需使用对象

          List<Object> records = new ArrayList<>();
          Map<String, String> bean = new HashMap<>();
      
          bean.put("A", "is A");
          bean.put("B", "is B lah");
          bean.put("C", "is C lah");
          bean.put("D", "is D");
          records.add(bean);
      
      
          String JSONBody2 = new Gson().toJson(records);
          System.out.println(JSONBody2);
      

      输出是

      [{"A":"is A","B":"is B lah","C":"is C lah","D":"is D"}]
      

      如果您查看 org.json.JSONObject 的实现,它内部包含一个名为 map 的变量,它存储所有数据。这是构造函数

      public JSONObject() {
          this.map = new HashMap<String, Object>();
      }
      

      当 GSON 尝试转换为 JSON 时,它只是递归地查看对象并将所有变量转换为 JSON。所以在这种情况下,它会转换内部映射,显示在 Json 输出中。

      【讨论】:

        猜你喜欢
        • 2011-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-14
        • 1970-01-01
        • 2021-01-13
        • 1970-01-01
        • 2020-11-12
        相关资源
        最近更新 更多