Java 使用GSON解析嵌套的JSON数据
我试图在Java中使用gson解析一些JSON数据,其结构如下,但通过在线查看示例,我找不到任何可以完成此工作的内容 有人能帮忙吗Java 使用GSON解析嵌套的JSON数据,java,json,parsing,gson,Java,Json,Parsing,Gson,我试图在Java中使用gson解析一些JSON数据,其结构如下,但通过在线查看示例,我找不到任何可以完成此工作的内容 有人能帮忙吗 { "data":{ "id":[ { "stuff":{ }, "values":[ [ 123,
{
"data":{
"id":[
{
"stuff":{
},
"values":[
[
123,
456
],
[
123,
456
],
[
123,
456
],
],
"otherStuff":"blah"
}
]
}
}
取决于你想做什么。您可以只设置一个与您的
json
匹配的POJO继承人权限,如图所示(首选方法)。或者,您可以提供一个自定义。我只处理id
数据,因为我认为这是一个棘手的实现。只需使用gson
类型逐步浏览json
,并构建您试图表示的数据。Data
和Id
类只是由原始json
字符串中的属性组成的pojo
public class MyDeserializer implements JsonDeserializer<Data>
{
@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<Id> 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);
}
结果:
Data{ids=[Id {nestedList=[[123, 456], [987, 654]]}]}
POJO:
公共类数据
{
私有列表ID;
公共数据(列表ID)
{
this.ids=ids;
}
@凌驾
公共字符串toString()
{
返回“Data{“+”ids=“+ids+'}”;
}
}
公共类Id
{
私有列表嵌套列表;
公共Id()
{
nestedList=新的ArrayList();
}
public void addNestedValues(最终整数[]值)
{
添加(值);
}
@凌驾
公共字符串toString()
{
最终列表formattedOutput=new ArrayList();
对于(整数[]整数:嵌套列表)
{
formattedOutput.add(Arrays.asList(integers.toString());
}
返回“Id{“+”nestedList=“+formattedOutput+'}”;
}
}
您只需要创建一个Java类结构来表示JSON中的数据。为了做到这一点,我建议您将JSON复制到这里,您将更清楚地看到JSON的结构
基本上您需要这些类(伪代码):
就这样!现在,您可以使用getter和setter访问响应
对象中的所有数据
例如,要访问第一个值456
,您需要执行以下操作:
int value = response.getData().getId().get(0).getValues().get(0).get(1);
我冒昧地建议您,它还发现了PO提供的Json上的一个语法错误。我认为[link][在获取Json响应和为您创建Java对象时非常有用!如果这个“id”:[的值是可变的呢?比如说“2”、“3”、“4”。您将如何在您的pojo中定义它?还要确保Proguard不会删除子类pojo的字段。发生在我身上,子类仅在父pojo中被引用,其所有字段都被删除,我不明白对象为什么不会填充。
-保留类com.example.*{*;}
public class Data
{
private List<Id> ids;
public Data(List<Id> ids)
{
this.ids = ids;
}
@Override
public String toString()
{
return "Data{" + "ids=" + ids + '}';
}
}
public class Id
{
private List<Integer[]> nestedList;
public Id()
{
nestedList = new ArrayList<>();
}
public void addNestedValues(final Integer[] values)
{
nestedList.add(values);
}
@Override
public String toString()
{
final List<String> formattedOutput = new ArrayList();
for (Integer[] integers : nestedList)
{
formattedOutput.add(Arrays.asList(integers).toString());
}
return "Id {" + "nestedList=" + formattedOutput + '}';
}
}
class Response
Data data
class Data
List<ID> id
class ID
Stuff stuff
List<List<Integer>> values
String otherStuff
Gson gson = new Gson();
Response response = gson.fromJson(yourJsonString, Response.class);
int value = response.getData().getId().get(0).getValues().get(0).get(1);