我正在编写一个反序列化程序,它读取一个巨大的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
}]
}
}
发布于 2019-01-30 11:05:48
使用GSON,我只需要为要解析的数据创建相应的DTO。
所以你有一些包装器,它是根对象:
@Getter
public class Wrapper {
private CityDetails cityDetails;
}
和城市详细信息:
@Getter
public class CityDetails {
private List<Person> people;
}
可能还有列表people
中的许多Person
@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类中指定的内容,其余的在解析时被忽略。
https://stackoverflow.com/questions/54438446
复制