Java-多个GSON?

Java-多个GSON?,java,json,Java,Json,好的,我正在创建一个使用JSON保存日期的应用程序。我使用了GSON作为我的JSON处理器 是的,我知道如何使用Gson。我在网上学习教程。问题是,教程在web上只保存“一”个json数据。我是说,比如说 { "Data1": { "name": "Data1", "info": "ABCDEFG" } } 所以,在用户保存了Data1之后,他们希望像这样保存Data2、Data3等等 { "Data1": { "name": "Da

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

是的,我知道如何使用
Gson
。我在网上学习教程。问题是,教程在web上只保存“一”个json数据。我是说,比如说

{
    "Data1": {
      "name": "Data1",
      "info": "ABCDEFG"
    }
}
所以,在用户保存了Data1之后,他们希望像这样保存Data2、Data3等等

{
    "Data1": {
      "name": "Data1",
      "info": "ABCDEFG"
    },
    "Data2": {
      "name": "Data2",
      "info": "ABCDEFGHIJ"
    }
}
{
    "data1": {
      "name": "data1",
      "info": "abcde"
    },
    "data2": {
      "name": "data2",
      "info": "abcdef"
    }
}
但如果用户想要保存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<String, String> 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();
        }
    }
}
好的,现在我更改值(表示我要添加新数据

data.put("name", "data2");
data.put("info", "abcdef");
bean.setData(data);
结果是这样的

{
  "data": {
    "name": "data1",
    "info": "abcde"
  }
}
{
  "data": {
    "name": "data2",
    "info": "abcdef"
  }
}
但是我想要这样的结果

{
    "Data1": {
      "name": "Data1",
      "info": "ABCDEFG"
    },
    "Data2": {
      "name": "Data2",
      "info": "ABCDEFGHIJ"
    }
}
{
    "data1": {
      "name": "data1",
      "info": "abcde"
    },
    "data2": {
      "name": "data2",
      "info": "abcdef"
    }
}

所以我的问题是,我该怎么做?如果用户想要保存100多个数据,我必须创建100多个类或元素吗?还有,如何添加“
selectedData:“data1”
”这样我的json加载程序才能只加载1个数据?

将数据作为对象

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


将ArrayList转换为JSON

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

这个

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

这个

是一个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<String, CustomBean> objects = gson.fromJson(json, new TypeToken<Map<String, CustomBean>>() {}.getType());
    System.out.println(objects);
}
上面的照片

{Data1=[name = Data1, info = ABCDEFG], Data2=[name = Data2, info = ABCDEFGHIJ]}
由于两个嵌套对象是相同的,您可以告诉
Gson
将它们反序列化为
Map
,其中JSON对象的名称是键,对象本身是值

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


现在我们回到您的问题,您已经编辑了它

所以我的问题是,我该怎么做呢?如果用户想保存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<String, Bean> map = new HashMap<>();
map.put("data1", new Bean());
因为键是
字符串
data1
,而值是另一个JSON对象,如上面所示,它是序列化的

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

上面应该清楚你需要做什么

还有,如何添加“selectedData:“data1”以便我的json加载程序 仅加载1个数据


请澄清您的意思。您不能只加载JSON的一个子集。Gson将加载所有JSON,您可以从中提取名为
data1
的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;
    }
}
然后反序列化映射

  Gson gson = new Gson();              

  Type collectionType = new TypeToken<Map<String, Data>>(){}.getType();
  Map<String, Data> datas = gson.fromJson(json, collectionType);

  Data data1 = datas.get("data1");
Gson-Gson=new-Gson();
Type collectionType=new-TypeToken(){}.getType();
Map data=gson.fromJson(json,collectionType);
datadata1=datas.get(“data1”);

看起来像是一个
映射图在这里可以工作。这将产生一个JSON数组。OP有一个JSON对象。TBH,看起来OP最好使用一个对象数组,他只是这样做,因为他没有意识到这一点。@jeremy,这取决于它。如果这100多个JSON对象具有相同的格式,那么您只需要一个类(加上任何嵌套)。请尝试我建议的包含2个以上json对象的代码。然后用json数组做一个示例。不,您的代码不起作用。我以前试过。它会将旧的json数据替换为新的json数据。@Jeremy请编辑您的问题,并显示您尝试运行的代码和出现的错误。它对我非常有效。@Jeremy您正在做一些完整的事情。@Jeremy与我的建议完全无关。你的
Map
Map,是
Bean
的一个字段。我有
Map
,它是根JSON对象。@Jeremy我的问题中已有的示例有什么问题吗?我想你需要理解进入JSON字符串的数据类型。仔细阅读。你不需要创建100个类您将只有100个类数据实例。
{
    "data1": {
      "name": "some value",
      "info": "some other value"
    }
}
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;
    }
}
  Gson gson = new Gson();              

  Type collectionType = new TypeToken<Map<String, Data>>(){}.getType();
  Map<String, Data> datas = gson.fromJson(json, collectionType);

  Data data1 = datas.get("data1");