Java – 多个GSON?

好的,我正在创建一个使用JSON来保存日期的应用程序。 我使用GSON作为我的JSON “处理器”。

是的我知道如何使用Gson 。 我在网上关注教程。 问题是,web上的教程只保存“一个”json数据。 我的意思是,例如,

 { "Data1": { "name": "Data1", "info": "ABCDEFG" } } 

因此,在用户保存Data1之后,他们想要像这样保存Data2,Data3等

 { "Data1": { "name": "Data1", "info": "ABCDEFG" }, "Data2": { "name": "Data2", "info": "ABCDEFGHIJ" } } 

但如果用户想要保存100多个数据,我必须制作100个课程吗? 以下是我的代码。

JSONTest.class

 public class JSONTest { private static Gson gson; private static File file; private static JSONTest instance; private static Bean bean; private static Map data = new HashMap(); public static void main(String[] args) { bean = new Bean(); File file = new File("C://test-json.json"); GsonBuilder builder = new GsonBuilder(); builder.setPrettyPrinting(); gson = builder.create(); data.put("name", "data1"); data.put("info", "abcde"); bean.setData(data); String jsonString = gson.toJson(bean); try { FileWriter fw = new FileWriter(file); fw.write(jsonString); fw.close(); } catch(IOException e) { e.printStackTrace(); } } } 

Bean.class

 public class Bean { private Map data; public Map getData() { return data; } public void setData(Map properties) { this.data = properties; } } 

结果是这样的

 { "data": { "name": "data1", "info": "abcde" } } 

好的,我现在改变了值(意味着我想添加新数据)

 data.put("name", "data2"); data.put("info", "abcdef"); bean.setData(data); 

结果就是这样

 { "data": { "name": "data2", "info": "abcdef" } } 

但我想要这样的结果

 { "data1": { "name": "data1", "info": "abcde" }, "data2": { "name": "data2", "info": "abcdef" } } 

所以我的问题是,我该怎么做?如果用户想要保存100多个数据,我必须制作100 +类或元素吗? 而且,如何添加“ selectedData: "data1" ”所以我的json加载器只加载1个数据?

在使用JSON解析器/生成器之前,您必须了解所使用的JSON。

这个

 { "Data1": { "name": "Data1", "info": "ABCDEFG" } } 

是一个JSON对象,包含名为Data1的JSON对象。

这个

 { "Data1": { "name": "Data1", "info": "ABCDEFG" }, "Data2": { "name": "Data2", "info": "ABCDEFGHIJ" } } 

是一个JSON对象,包含两个名为Data1Data2 JSON对象。

一个简单的工作示例就是

 public static void main(String[] args) throws Exception { String json = "{ \"Data1\": { \"name\": \"Data1\", \"info\": \"ABCDEFG\" }, \"Data2\": { \"name\": \"Data2\", \"info\": \"ABCDEFGHIJ\" } }"; Gson gson = new Gson(); Map objects = gson.fromJson(json, new TypeToken>() {}.getType()); System.out.println(objects); } 

CustomBean位置

 public class CustomBean { private String name; private String info; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getInfo() { return info; } public void setInfo(String info) { this.info = info; } public String toString() { return "[name = " + name + ", info = " + info + "]"; } } 

以上打印

 {Data1=[name = Data1, info = ABCDEFG], Data2=[name = Data2, info = ABCDEFGHIJ]} 

由于两个嵌套对象都是相同的,因此您可以告诉Gson将它们反序列化为一个Map ,其中JSON对象的名称是键,对象本身就是值。

JSON格式具有可以映射到Java类型的非常特定的类型。 您必须使用相应的类型。 例如,您将使用List作为JSON数组。


现在让我们回过头来编辑它

所以我的问题是,我该怎么做?如果用户想要保存100多个数据,我必须制作100 +类或元素吗? 而且,如何添加“selectedData:”data1“”所以我的json加载器只加载1个数据?

通过你给出的例子,我觉得你误解了Gson的工作原理。

Gson尝试将您的对象序列化为JSON对象。 像一个简单类的对象

 public class Bean { private String name = "some value"; private String info = "some other value"; } 

很好地映射到以下JSON对象

 { "name" : "some value", "info" : "some other value" } 

java类Map是一个特殊的类,可以很好地映射到JSON。 该键用作JSON对象的名称,该值用作JSON对象的值,可以是数字,字符串,JSON数组或其他JSON对象。 所以下面的代码片段中的Map对象

 Map map = new HashMap<>(); map.put("data1", new Bean()); 

由Gson序列化将提供以下JSON

 { "data1": { "name": "some value", "info": "some other value" } } 

因为键是String data1 ,而值是另一个JSON对象,如上所示序列化。

所以我的问题是,我该怎么做?如果用户想要保存100多个数据,我必须制作100 +类或元素吗?

应该清楚以上你需要做什么。

而且,如何添加“selectedData:”data1“”所以我的json加载器只加载1个数据?

请澄清你的意思。 您不能只加载JSON的子集。 Gson将加载所有这些,您可以从中提取名为data1的JSON对象。

将数据作为对象。

设置其值并将其保存在ArrayList中。

将ArrayList转换为JSON

正如Sotirios Delimanolis所说,你想要一张地图即

 public class Data { private final String name; private final String info; public Data(String name, String info) { this.name = name; this.info = info; } public String getInfo() { return info; } public String getName() { return name; } } 

然后反序列化为Map。 即

  Gson gson = new Gson(); Type collectionType = new TypeToken>(){}.getType(); Map datas = gson.fromJson(json, collectionType); Data data1 = datas.get("data1");