使用GSON解析嵌套的JSON数据

我正在尝试使用具有以下结构的Java中的gson解析一些JSON数据,但通过在线查看示例,我找不到任何可以完成工作的东西。

有人能帮忙吗?

{ "data":{ "id":[ { "stuff":{ }, "values":[ [ 123, 456 ], [ 123, 456 ], [ 123, 456 ], ], "otherStuff":"blah" } ] } } 

您只需要创建一个表示JSON中数据的Java类结构。 为了做到这一点,我建议你将你的JSON复制到这个在线JSON Viewer中 ,你会看到你的JSON结构更加清晰……

基本上你需要这些类(伪代码):

 class Response Data data class Data List id class ID Stuff stuff List> values String otherStuff 

请注意,类中的属性名称必须与JSON字段的名称匹配! 您可以根据实际的JSON结构添加更多属性和类…还要注意,您需要所有属性的getter和setter!

最后,您只需要将JSON解析为Java类结构:

 Gson gson = new Gson(); Response response = gson.fromJson(yourJsonString, Response.class); 

就是这样! 现在,您可以使用getter和setter访问response对象中的所有数据…

例如,要访问第一个值456 ,您需要执行以下操作:

 int value = response.getData().getId().get(0).getValues().get(0).get(1); 

取决于您要做的事情。 你可以设置一个与你的json相匹配的POJO层次(首选方法)。 或者,您可以提供自定义反序列化程序 。 我只处理了id数据,因为我认为这是一个棘手的实现。 只需使用gson类型单步执行json ,然后构建您要表示的数据。 DataId类只是由原始json字符串组成并反映其属性的json

 public class MyDeserializer implements JsonDeserializer { @Override public Data deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) throws JsonParseException { final Gson gson = new Gson(); final JsonObject obj = je.getAsJsonObject(); //our original full json string final JsonElement dataElement = obj.get("data"); final JsonElement idElement = dataElement.getAsJsonObject().get("id"); final JsonArray idArray = idElement.getAsJsonArray(); final List parsedData = new ArrayList<>(); for (Object object : idArray) { final JsonObject jsonObject = (JsonObject) object; //can pass this into constructor of Id or through a setter final JsonObject stuff = jsonObject.get("stuff").getAsJsonObject(); final JsonArray valuesArray = jsonObject.getAsJsonArray("values"); final Id id = new Id(); for (Object value : valuesArray) { final JsonArray nestedArray = (JsonArray)value; final Integer[] nest = gson.fromJson(nestedArray, Integer[].class); id.addNestedValues(nest); } parsedData.add(id); } return new Data(parsedData); } 

}

测试:

  @Test public void testMethod1() { final String values = "[[123, 456], [987, 654]]"; final String id = "[ {stuff: { }, values: " + values + ", otherstuff: 'stuff2' }]"; final String jsonString = "{data: {id:" + id + "}}"; System.out.println(jsonString); final Gson gson = new GsonBuilder().registerTypeAdapter(Data.class, new MyDeserializer()).create(); System.out.println(gson.fromJson(jsonString, Data.class)); } 

结果:

 Data{ids=[Id {nestedList=[[123, 456], [987, 654]]}]} 

POJO:

 public class Data { private List ids; public Data(List ids) { this.ids = ids; } @Override public String toString() { return "Data{" + "ids=" + ids + '}'; } } public class Id { private List nestedList; public Id() { nestedList = new ArrayList<>(); } public void addNestedValues(final Integer[] values) { nestedList.add(values); } @Override public String toString() { final List formattedOutput = new ArrayList(); for (Integer[] integers : nestedList) { formattedOutput.add(Arrays.asList(integers).toString()); } return "Id {" + "nestedList=" + formattedOutput + '}'; } }