在流数据进行解析的同时从JSON模式中选择任何元素

时间:2019-01-30 10:31:42

标签: jackson gson jsonschema

我正在编写一个反序列化器,该序列化器读取一个巨大的json文件,并将与过滤器(我的应用程序中的逻辑)匹配的记录放入数据库中。 json文件具有如下固定模式:

{
    "cityDetails": {
        "name": "String",
        "pinCodes": "Array of integers ",
        "people": [{
            "name": "String",
            "age": "Integer"
        }]
    }
}

我只对文件中“人”的流式列表感兴趣。我知道GSON / Jackson提供了我可以使用的流API,但是我想避免在流化它们并匹配它们的名称以查看是否对它们感兴趣时遍历这些令牌。我相信应该有一个解决方案,可以在后台进行流传输并将流指向/寻找我感兴趣的令牌。如果提供我的JSON模式,我看不出为什么不应该这样做。有解决方案吗?

这是我的JSON的示例实例:

{
    "cityDetails": {
        "name": "mumbai",
        "pinCodes": ["400001", "400002"],
        "people": [{
            "name": "Foo",
            "age": 1
        }, {
            "name": "Bar",
            "age": 2
        }]
    }
}

2 个答案:

答案 0 :(得分:0)

使用GSON,我将为要解析的数据创建相应的DTO。

因此,您有一些包装是根对象:

@Getter
public class Wrapper {
    private CityDetails cityDetails; 
}

和城市详细信息:

@Getter
public class CityDetails {
    private List<Person> people;
}

以及列表Person中的许多people

@Getter
@ToString
public class Person {
    private String name;
    private Integer age;
}

然后,您可以像下面这样简单地使用Reader

@Test
public void test() {
    Gson gson = new Gson();
    // assuming your json is named "test.json" in the same directory as test
    Reader r = new InputStreamReader(getClass().getResourceAsStream("test.json"));
    Wrapper wrapper = gson.fromJson(r, Wrapper.class);        
    wrapper.getCityDetails().getPeople().forEach(p -> log.info("{}", p.toString()));
}

Gson将仅搜索和实例化DTO类中指定的内容,其余的将在解析时忽略。

答案 1 :(得分:0)

执行此操作的一种好方法是使用JsonPath

的json路径:

$.cityDetails.people

将仅返回人员数组的内容:

[
  [
    {
      "name": "Foo",
      "age": 1
    },
    {
      "name": "Bar",
      "age": 2
    }
  ]
]

Here是Java实现...