使用gson issue

时间:2019-06-19 06:42:26

标签: java json gson

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

我什至尝试通过使用new Gson()。toJson(bean)来隐藏bean。但是输出结果还包含一层父级“ map”,用于包装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。但是我不知道为什么“ map”出现在这里。与以前一样,它无需父级“地图”即可完成工作。 (相同的代码和相同的库只是新创建的项目,但存在此问题)

4 个答案:

答案 0 :(得分:0)

使用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);

答案 1 :(得分:0)

尝试

  String JSONBody2 = record.toString());

会给您[{“ A”:“是A”,“ B”:“是B lah”,“ C”:“是C lah”,“ D”:“是D”}]

您可以通过此链接https://stackoverflow.com/a/27893392/4500099

更好地了解类型转换

答案 2 :(得分:0)

不要使用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输出中。

答案 3 :(得分:0)

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

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