使用GSON解析嵌套的JSON数据

时间:2013-10-03 21:42:40

标签: java json parsing gson

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

有人能帮忙吗?

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

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

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

2 个答案:

答案 0 :(得分:42)

您只需要创建一个表示JSON中数据的Java类结构。为了做到这一点,我建议你将你的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);

答案 1 :(得分:11)

取决于您要做的事情。你可以设置一个与json id匹配的POJO层次(首选方法)。或者,您可以提供自定义here。我只处理了json数据,因为我认为这是一个棘手的实现。只需使用gson类型单步执行Data,然后构建您要表示的数据。 Idpojos类仅由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]]}]}

结果:

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

POJO:

{{1}}