web-dev-qa-db-fra.com

Analyse des données JSON imbriquées à l'aide de GSON

J'essaie d'analyser certaines données JSON en utilisant gson dans Java qui a la structure suivante mais en regardant des exemples en ligne, je ne trouve rien qui fasse le travail.

Quelqu'un pourrait-il aider?

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

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

                ],
                "otherStuff":"blah"
            }
        ]
    }
}
22
user2844485

Il vous suffit de créer une structure de classe Java qui représente les données de votre JSON. Pour ce faire, je vous suggère de copier votre JSON dans ce visualiseur JSON en ligne = et vous verrez la structure de votre JSON beaucoup plus claire ...

Fondamentalement, vous avez besoin de ces classes (pseudo-code):

class Response
  Data data

class Data
  List<ID> id

class ID
  Stuff stuff
  List<List<Integer>> values
  String otherStuff

Notez que les noms d'attribut dans vos classes doivent correspondre aux noms de vos champs JSON! Vous pouvez ajouter plus d'attributs et de classes en fonction de votre structure JSON réelle ... Notez également que vous avez besoin de getters et setters pour tous vos attributs!

Enfin, il vous suffit d'analyser le JSON dans votre structure de classe Java avec:

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

Et c'est tout! Vous pouvez maintenant accéder à toutes vos données dans l'objet response à l'aide des getters et setters ...

Par exemple, pour accéder à la première valeur 456, vous devrez faire:

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

Selon ce que vous essayez de faire. Vous pouvez simplement configurer une hiérarchie POJO qui correspond à votre json comme vu ici (méthode préférée). Ou, vous pouvez fournir un désérialiseur personnalisé . Je n'ai traité que les données id car j'ai supposé que c'était l'implémentation délicate en question. Parcourez simplement les json en utilisant les types gson et générez les données que vous essayez de représenter. Les classes Data et Id sont simplement pojos composées et reflétant les propriétés de la chaîne json d'origine.

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

}

Tester:

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

Résultat:

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