【问题标题】:Parsing nested JSON data using GSON使用 GSON 解析嵌套的 JSON 数据
【发布时间】:2013-10-03 21:42:39
【问题描述】:

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

有人可以帮忙吗?

{
    "data":{
        "id":[
            {
                "stuff":{

                },
                "values":[
                    [
                        123,
                        456
                    ],
                    [
                        123,
                        456
                    ],
                    [
                        123,
                        456
                    ],

                ],
                "otherStuff":"blah"
            }
        ]
    }
}

【问题讨论】:

    标签: java json parsing gson


    【解决方案1】:

    您只需要创建一个 Java 类结构来表示 JSON 中的数据。为此,我建议您将 JSON 复制到 online JSON Viewer 中,这样您的 JSON 结构就会更加清晰......

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

    class Response
      Data data
    
    class Data
      List<ID> id
    
    class ID
      Stuff stuff
      List<List<Integer>> 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.parser.online.fr,它还发现了PO提供的Json语法错误。
    • 我认为 [link][jsonschema2pojo.org] 在获取 JSON 响应并为您创建 Java 对象方面非常有用!
    • 如果这个 "id":[ 的值是可变的怎么办?让我们说“2”、“3”、“4”。你会如何在你的 pojo 中定义这个?
    • 还要确保 Proguard 不会删除您的子类 POJO 的字段。发生在我只在父 POJO 中引用子类的地方,它的所有字段都被删除了,不明白为什么对象不会填充。 -keep class com.example.** { *; }
    【解决方案2】:

    取决于你想要做什么。您可以设置一个与您的json 匹配的 POJO 层次结构,如 here 所示(首选方法)。或者,您可以提供自定义 deserializer。我只处理了id 数据,因为我认为这是有问题的棘手实现。只需使用gson 类型逐步遍历json,并构建您要表示的数据。 DataId 类只是由 pojos 组成并反映了原始 json 字符串中的属性。

    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);
      }
    

    }

    测试:

      @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<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 + '}';
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多