2017-10-17 29 views
1

J'utilise Gson pour créer une chaîne JSON. Jusqu'à présent, j'ai sérialisé des classes relativement petites avec quelques membres, donc j'ai juste créé une classe avec les membres nécessaires et juste utilisé toJson pour créer le json. Si c'est pertinent pour cette question, alors c'est dans une application Android.Correct façon de créer une grande chaîne JSON en utilisant Gson

Maintenant, j'ai besoin de créer un json plus complexe avec de nombreux champs et plusieurs niveaux. Un exemple de JSON (au moins une partie de celui-ci juste pour montrer l ' « esprit » de celui-ci):

"sleep" : { 
    "program" : { 
    "appName" : "name", 
    "appVersion" : "1.7" 
    "serverVersion" : 19 
    }, 
    "userType" : "new", 
    "userInfo" : { 
     "firstName" : "Hans", 
     "lastName" : "Schmidt", 
     "city" : "Berlin", 
     "country" : "Germany", 
    }, 
    "settings" : { 
     "setting1" : "y", 
     "setting2" : "none" 
} 
... 
} 

Dans ce cas, dois-je créer une classe différente pour chaque arbre? par exemple, une classe pour la partie "programme", une classe pour "userInfo" et ainsi de suite, puis créer une classe pour la racine "sleep" qui contient chaque classe plus petite comme membre et utilise toJson dessus? Je suppose que cela fonctionnera, mais est-ce le moyen le plus efficace de créer autant de classes pour un seul JSON?

+0

Quel est le problème, gson fera le travail pour vous? –

+1

Si vous voulez une représentation pojo de votre json alors vous aurez besoin de différentes classes pour les différents niveaux d'arbres comme vous l'avez suggéré. Si vous n'en avez pas besoin vous pourriez probablement (je ne connais pas Gson mais je suppose que c'est très similaire à Jackson) également utiliser une combinaison de maps/instances JSONObject et lists/instances JSONArray. – Thomas

+0

et vous pouvez simplement écrire des classes et l'implémenter les uns avec les autres, puis gson fera le travail –

Répondre

0

Vous pouvez utiliser la carte pour atteindre l'objectif. Dans le cas extrême (je veux dire, dans le cas où vous ne voulez pas créer des classes), si vous voulez créer cette JSON:

{ 
    "sleep":{ 
     "userInfo":{ 
     "firstName":"Hans", 
     "lastName":"Schmidt", 
     "country":"Germany", 
     "city":"Berlin" 
     }, 
     "settings":{ 
     "setting2":"none", 
     "setting1":"y" 
     }, 
     "program":{ 
     "appVersion":"1.7", 
     "serverVersion":19, 
     "appName":"name" 
     }, 
     "userType":"new" 
    } 
} 

Vous pouvez faire:

Gson gson = new Gson(); 

    Map<String, Object> finalObject= new HashMap<>(); 
    Map<String, Object> sleep= new HashMap<>(); 
    Map<String, Object> program= new HashMap<>(); 
    Map<String, String> userInfo= new HashMap<>(); 
    Map<String, Object> settings= new HashMap<>(); 

    program.put("appName", "name"); 
    program.put("appVersion", "1.7"); 
    program.put("serverVersion", 19); 

    userInfo.put("firstName", "Hans"); 
    userInfo.put("lastName", "Schmidt"); 
    userInfo.put("city", "Berlin"); 
    userInfo.put("country", "Germany"); 


    settings.put("setting1", "y"); 
    settings.put("setting2", "none"); 

    sleep.put("program", program); 
    sleep.put("userType", "new"); 
    sleep.put("userInfo", userInfo); 
    sleep.put("settings", settings); 

    finalObject.put("sleep", sleep); 

    System.out.println(gson.toJson(finalObject)); 

Mais, comme dit dans une autre réponse, il est souvent recommandé de créer les POJO.

EDIT

Il y a une autre façon pour le faire. Utilisation de la JsonObject classe:

JsonObject finalJsonObject= new JsonObject(); 
    JsonObject jsonSleep= new JsonObject(); 
    JsonObject jsonProgram= new JsonObject(); 
    JsonObject jsonUserInfo= new JsonObject(); 
    JsonObject jsonSettings= new JsonObject(); 

    jsonUserInfo.addProperty("firstName", "Hans"); 
    jsonUserInfo.addProperty("lastName", "Schmidt"); 
    jsonUserInfo.addProperty("country", "Germany"); 
    jsonUserInfo.addProperty("city", "Berlin"); 


    jsonSettings.addProperty("setting2", "none"); 
    jsonSettings.addProperty("setting1", "y"); 

    jsonProgram.addProperty("appVersion", "1.7"); 
    jsonProgram.addProperty("serverVersion", 19); 
    jsonProgram.addProperty("appName", "name"); 


    jsonSleep.add("userInfo", jsonUserInfo); 
    jsonSleep.add("settings", jsonSettings); 
    jsonSleep.add("program", jsonProgram); 
    jsonSleep.addProperty("userType", "new"); 

    finalJsonObject.add("sleep", jsonSleep); 

    System.out.println(String.valueOf(finalJsonObject)); 

Si vous remarquez que vous utilisez toujours le même code, vous devez créer les classes (afin d'améliorer la mise en correspondance et éliminer la répétition). Si vous utilisez quelques classes, vous pouvez utiliser cette approche (et éviter de créer chaque classe dont vous avez besoin).

+0

Quand est-il recommandé d'utiliser les POJO? Pas seulement si je reçois une représentation json et que je dois la désérialiser? –

+0

@YonatanNir Je viens d'éditer la réponse. –

1

Vous pouvez prendre deux approches:

1) Créer des classes Java pour chaque "niveau", et jouer avec des champs de POJO. Je pense que c'est la bonne approche. Le sérialiseur GSON est optimisé pour cela, alors ne vous inquiétez pas pour les performances.

2) Créer le JSON "à la main". Ceci n'est pas recommandé et vous n'obtiendrez aucune amélioration significative des performances. De plus, vous n'utilisez pas la puissance du POO. De toute façon, si possible, essayez d'organiser vos données pour utiliser le moins de "niveaux" possible, cela va certainement aider avec les performances.

0

Vous pouvez obtenir ceci en créant les classes de modèle et une classe parente.

par exemple

Class Sleep{ 


hashmap<String,Object> sleep; 

//getters and setters 



} 



Class program{ 
String appName,appVersion,serverVersion; 

// getters and setters; 


} 

Class userInfo{ 
String firstName,lastName,city,country 

// getters and setters 

} 



Main(){ 

Sleep sleep = new Sleep(); 

Hashmap<String,Object> sl = new HashMap<>(); 
sleep.setSleep() = sl; 

program p = new program(); 
p.setappName("name"); 
p.setappVersion("1.7"); 
p.serverVersion("19"); 

sl.put("program",p); 

// similarly for the userInfo 

new Gson().toJson(sleep); 

// This will give you the nested json as you wanted. 
} 
0

S'il vous plaît utiliser le Google GSON jar
S'il vous plaît utiliser ce code ci-dessous cisailles, il peut vous être utile.

GsonBuilder builder = new GsonBuilder(); 
Gson gson = builder.create(); 
String json = gson.toJson(List<user>);