Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用GSON解析嵌套的JSON数据_Java_Json_Parsing_Gson - Fatal编程技术网

Java 使用GSON解析嵌套的JSON数据

Java 使用GSON解析嵌套的JSON数据,java,json,parsing,gson,Java,Json,Parsing,Gson,我试图在Java中使用gson解析一些JSON数据,其结构如下,但通过在线查看示例,我找不到任何可以完成此工作的内容 有人能帮忙吗 { "data":{ "id":[ { "stuff":{ }, "values":[ [ 123,

我试图在Java中使用gson解析一些JSON数据,其结构如下,但通过在线查看示例,我找不到任何可以完成此工作的内容

有人能帮忙吗

{
    "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);