使用GSON将Json解析为JSON元素可能变化的JAVA对象

时间:2017-07-07 09:57:41

标签: java json parsing gson

我正在尝试使用GSON将JSON .txt文件解析为JAVA对象。 JSON文件具有以下结构:

    {
        "event0" : {
        "a" : "abc",
        "b" : "def"
        },

        "event1" : {
        "a" : "ghi",
        "b" : "jkl",
        "c" : "mno"
        }
    }

我已将文本文件读入名为dataStr的String中。我想使用fromJson方法将事件捕获到以下JAVA类中:

public class Event {
    private String a;
    private String b;
    private String c;

    public Event() {}

}

问题是JSON在某些元素中可能有一个额外的字段“c”。我想将所有事件解析为Event类对象,对于没有“c”字段的情况,我想在我的对象中使其为null或零。事先不知道哪个元素具有“c”字段。

具体来说,我无法弄清楚如何在一些JSON元素中处理一个额外的字段。我想按照以下方式做点什么:

Gson gson = new Gson();
ArrayList<Event> events = gson.fromJson(dataStr, Event.class);

但我首先陷入困境,如何迭代Json文件中的事件,其次,如何处理一些偶然缺失的字段到同一个Event对象中。我真的很感激正确的方向踢。谢谢大家。

我对JSON解析相当新,可能在以下答案中遗漏了一些内容:

Using Gson to convert Json into Java Object

Mapping JSON into POJO using Gson

Using gson to parse json to java object

Parse JSON into a java object

How to parse a json file into a java POJO class using GSON

4 个答案:

答案 0 :(得分:3)

我不确定我是否理解你的问题。根据我的理解,您正在尝试使用java类中不可用的额外字段转换json对象。坦率地说,我不明白你为什么要这样,或者是否有可能开始。您可以通过将json转换为Map来实现解决方法。

Map map = gson.fromJson(jsonString,Map.class);

答案 1 :(得分:0)

Gson会自动为你做这件事。

所以,如果你有一个班级&#34; Alpha&#34;有3个字段(&#34; a&#34;,&#34; b&#34;和&#34; c&#34;)并尝试处理一个json对象,该对象有2个字段,其名称与Alpha&匹配#39; s&#34; a&#34;和&#34; b&#34;,Gson将填补&#34; a&#34;和&#34; b&#34;使用json文件的值和&#34; c&#34;将自动设置为null。

所以,在你的情况下,如果你这样写:

ArrayList<Event> events = gson.fromJson(dataStr, Event.class);

在你的json中,只有2个字段的事件(与任何事件的类字段相匹配)和所有字段设置的事件,你将得到一个没有错误的事件列表。也许你会得到一些空字段,但代码可以工作。

我希望能提供帮助!如果您愿意,可以询问更多信息!

修改

请注意,您的json文件不能是.txt而是.json!

答案 2 :(得分:0)

首先,我相信你的JSON应该是这样的:

{
  "events": [
    {
      "name": "event0",
      "a": "abc",
      "b": "def"
    },
    {
      "name": "event1",
      "a": "abc",
      "b": "def",
      "c": "mno"
    }
  ]
}

您的模型需要两个类:

public List<Event> events = null;

public class Event {
public String name;
public String a;
public String b;
public String c;

}

然后使用GSON

Events events = gson.fromJson(jsonData, Events.class);

此外,我建议始终使用JSON的在线验证程序,以确保您的JSON结构在编码之前是正确的。 https://jsonlint.com/ 或者为了形成JSON: http://jsonprettyprint.com/

此网站也可以通过JSON Schema或使用示例文件为您创建Java类。 http://www.jsonschema2pojo.org/

答案 3 :(得分:0)

请尝试以下代码段:

Gson gson = new Gson();
ArrayList<Event> events = gson.fromJson(dataStr, new TypeToken<ArrayList<Event>>(){}.getType());

在Gson的源代码中有一个非常明确的解释 enter image description here