Java - 多个GSON?

2024-02-15

好的,我正在创建一个使用的应用程序JSON保存日期。我用了GSON as my 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<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();
        }
    }
}

Bean.class

public class Bean
{
    private Map<String, String> data;

    public Map<String, String> getData()
    {
        return data;
    }

    public void setData(Map<String, String> 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。

This

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

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

This

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

是一个 JSON 对象,包含两个名为Data1 and Data2.

一个简单的工作示例是

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

where CustomBean is

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 对象的名称是键,对象本身是值。

The JSON格式 http://www.json.org/具有可以映射到 Java 类型的非常具体的类型。您必须使用相应的类型。例如,您可以使用List对于 JSON 数组。


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

所以我的问题是,我该怎么做?如果用户想保存 100 多个数据,我是否必须创建 100 多个类或元素?另外,如何添加“选定的数据:”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());

由 Gson 序列化将给出以下 JSON

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

因为关键是String data1该值是另一个 JSON 对象,它被序列化,如我上面所示。

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

通过上面的内容应该很清楚你需要做什么了。

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

请澄清你的意思。您不能仅加载 JSON 的子集。 Gson 将加载所有内容,您可以提取名为的 JSON 对象data1从那。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java - 多个GSON? 的相关文章

随机推荐

  • C++17 赋值排序:GCC 中仍未实现?

    我尝试了以下代码作为实现交换的天真的尝试R and B中的字节数ABGR word include
  • 为什么所需的 Startup 类不需要实现适当的接口,例如 IStartup?

    使用武士刀 为什么Startup类不应实现各自的接口 例如 interface IStartup void Configuration IAppBuilder app public class MyStartup IStartup publ
  • 在线求职门户系统用例图

    我想要一个在线求职门户系统的正确用例图 这是我的尝试 我有些疑惑 我看不出在哪里制作 登录 用例 这是该系统的一个重要用例 该用例图没有显示简单访问者和注册访问者之间的区别 前者可以查看职位空缺 查看建议 而无需拥有帐户 后者可以查看职位空
  • 使用 PyYAML.dump() 生成锚点?

    我希望能够在 PyYAML 的 dump 函数生成的 YAML 中生成锚点 有没有办法做到这一点 理想情况下 锚点应与 YAML 节点具有相同的名称 Example import yaml yaml dump a 1 2 3 a 1 2 3
  • 使用 php curl 抓取动态加载网站

    我是抓取新手 已经正式废弃了两个网站 但是当我尝试抓取动态加载网站时 问题出现了 当网站用 JavaScript 渲染时 我无法抓取网站的内容 有什么方法可以使用该网站的内容php curl或任何其他相关客户PHP 这就是我到目前为止所做的
  • 等到所有 jQuery Ajax 请求完成?

    如何让一个函数等待 直到所有 jQuery Ajax 请求在另一个函数内完成 简而言之 我需要等待所有 Ajax 请求完成后才能执行下一个请求 但如何呢 jQuery 现在定义了一个当函数 http api jquery com jQuer
  • F# 将元素添加到序列

    一个简单的问题我找不到答案 如何将元素添加到序列中 例如 我有一个 seq 和一个 newElem XElement 我想附加到它 Thanks 序列追加 gt let x 1 5 val x seq
  • 与普通对象类似地访问 JavaScript 映射

    我正在使用地图 因为我想存储一个对象作为键 我的问题是 我可以像访问普通对象一样访问地图吗 例如 let m new Map let obj foo bar m obj baz console log m obj 这应该按原样正常工作吗 还
  • 返回 R 中函数的函数

    我正在尝试创建一个创建并返回新函数的函数 我已经尝试过以下方法 但它不起作用 我想 myfunc lt function W myfunc2 function X Y W X return Y return myfunc2 我希望能够在 m
  • 示例设置.xml

    如何配置settings xml在马文 另外 请分享一个示例settings xml 这是带有注释的股票 settings xml 完整 未切割的文件位于底部 License
  • php:从字符串中删除 URL

    我有很多字符串 twitter 推文 当我回显它们时 我想从中删除链接 我无法控制该字符串 即使所有链接都以 http 开头 它们也可以以 或 结尾 不 并且后面是否有空格 此外 有时链接与其前面的单词之间没有空格 此类字符串的一个示例 T
  • 将 C++ 实例方法与 C 回调函数混合

    problem 我有一个来自 C 库的以下 C 回调签名Foo void RequestCallbackFunc int 该库还提供了用于注册所述回调的实用函数 extern void SetRequestCallback Requesta
  • 为 Mac 构建 libunwind

    我正在尝试在 Mac 上为 iOS 和 Mac 构建 libunwind 我能够解决一些编译问题 在 Mac 上构建 我使用配置项目 configure CC cc Ae D XOPEN SOURCE 500 并复制了elf h来自谷歌的
  • 检查函数参数类型是 Pythonic 吗?

    我知道 Python 中通常不赞成对函数参数进行类型检查 但我认为我已经想到了这样做是有意义的 在我的项目中 我有一个抽象基类Coord 有一个子类Vector 它具有更多功能 如旋转 改变大小等 数字列表和元组也将返回 Trueisins
  • Android GridView 有类别吗?

    是否可以使用类别或某种带有GridView在安卓中 我整理了一个简短的说明来说明我的想法 多谢 您可以使用粘性网格标题 http tonicartos github com StickyGridHeaders 直接使用库或作为模型来创建您自
  • 使用 mkl,加载共享库时出错:libmkl_intel_lp64.so

    我几乎是新使用的mkl图书馆 如果这看起来很愚蠢 请原谅 我尝试运行教程中的示例 here https software intel com en us node 529744 with ifort mkl dgemm example f
  • 使用现有数据导入 Magical Record

    我正在尝试使用Magical Record将数据导入到我的CoreData db 我正在实体工作Person眼下 A Person has firstName lastName personID属性 我知道我不需要 idString 我不在
  • 如何在不使用 DataContext 的情况下绑定到 Silverlight 中的本地属性?

    我有一个小问题 但发现了很多不同的 而且大多是模棱两可的答案 我有以下用户控件 我试图绑定到该控件中的公共属性 事件 每个人都说我必须使用数据上下文 但是 我真的不想这样做 我只想从控件的内部绑定到属性 XAML 要求是绑定必须是两种方式
  • UIActivityViewController 解雇 MailViewController

    我尝试通过 UIActivityViewController 发送电子邮件 它工作正常 但发送电子邮件后邮件视图不会被关闭 当用户按下 取消 按钮时 它也不会关闭 我可以做什么来解决这个问题 这是我使用过的代码 conf share vie
  • Java - 多个GSON?

    好的 我正在创建一个使用的应用程序JSON保存日期 我用了GSON as my JSON 处理器 是的 我知道如何使用Gson 我按照网络上的教程进行操作 问题是 Web 上的教程只保存 一个 json 数据 我的意思是 例如 Data1