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