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对象,包含两个名为Data1
和Data2
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
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