使用gson将jsonobject转换为字符串的问题

3

我试图使用GSON库将JsonObject转换为字符串。但是,结果会多出一个名为"map"的父级层包裹Json。请告诉我哪里做错了,为什么会出现父级"Map"层?

我甚至尝试使用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”。之前,它可以正常工作,没有父级“Map”包裹(相同的代码和相同的库,只是新建了一个项目,但出现了这个问题)。

2
请使用JSONArray代替List<JSONObject> - Sudhir Ojha
使用 JsonArray 代替使用 gson,使用 toString() 方法将其转换为字符串。 - Muhammad Ahmed
@SudhirOjha 偏爱可变对象。 - nica
@MuhammadAhmed 需要使用GSON来处理其他类型的对象。 - nica
4个回答

4

3
尽管其他人已经回答了这个问题,但我想强调一个重要的学习内容。有两种方法可以将JsonObject转换为字符串。 一种是new Gson().toJson(..),另一种是JsonObject.toString()
尽管在许多情况下两种方法都会产生相同的结果,但如果JsonObject包含一些包含有效网址或base64编码值的字符串字段,则第一种方法会将&=转换为相应的utf-8代表字符,这将使您的网址和base64编码值损坏。然而,第二种方法保留这些值不变。

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

1
在您的帖子中,您使用了“ArrayList <JSONObject>”而不是“new JSONArray()”,这实际上解决了您的问题 :) - Javier Aviles
@nica 是的,你只需要将你的 records 数据结构从 ArrayList 改为 JSONArray,代码的第一行就是修改,请看一下。 - Amit Rai
1
更倾向于使用ArrayList而不是JSONArray,另外我会使用T来处理不同类型的对象。 - nica

0

不要使用 JSON 对象,直接使用 Object

    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输出中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接