2017-10-16 20 views
0

Dire que j'ai 4 projetsGson Parsing: Bean Structure à différents projets

projet-a, projet-b, projet-c, projet commun

project-common est définie comme la dépendance (maven) dans tous les autres projets.

Maintenant, chaque projet lit des fichiers json séparés.

projet a, projet-b lit suivant JSON

{ "jsonLevel1" : { 
     "jsonLevel2" : { 
      "key1" : "value1", 
      "key2" : "value2" 
    } 
} 

projet c lit comme suit:

{ "jsonLevel1" : { 
      "jsonLevel2" : { 
       "key1" : "value1", 
       "key2" :"value2", 
       "key3" : "value3", 
       "jsonLevel3" : { 
        "string1" : "value11", 
        "string2" : "value22" 
      } 
     } 
    } 

Je veux avoir des classes POJO JsonLevel1, JsonLevel2 dans les projets communs et JavaLevel3 dans le projet-c. Mais, project-common ne reconnaît pas la classe JavaLevel3 (comme projet-c n'est pas une dépendance à project-common)

Comment puis-je faire cela?

Répondre

1

Si je comprends bien, vous avez dans votre projet communla classe:

JsonLevel1.java

public class JsonLevel1 { 
    JsonLevel2 jsonLevel2; 

} 

JsonLevel2.java

public class JsonLevel2 { 
    String key1; 
    String key2; 
    String key3; 
    JsonLevel3 jsonLevel3; 
} 

Et en classe JsonLevel2, car il n'y a pas la classe JsonLevel3 dans ce projet, il y a votre problème.

Vous pourriez le faire. Dans la classe JsonLevel2 vous pouvez insérer, au lieu de la classe JsonLevel3, une carte:

public class JsonLevel2 { 
    String key1; 
    String key2; 
    String key3; 
    Map<String,String>jsonLevel3; 

    public String getKey1() { 
     return key1; 
    } 

    public void setKey1(String key1) { 
     this.key1 = key1; 
    } 

    public String getKey2() { 
     return key2; 
    } 

    public void setKey2(String key2) { 
     this.key2 = key2; 
    } 

    public String getKey3() { 
     return key3; 
    } 

    public void setKey3(String key3) { 
     this.key3 = key3; 
    } 

    public Map<String, String> getJsonLevel3() { 
     return jsonLevel3; 
    } 

    public void setJsonLevel3(Map<String, String> jsonLevel3) { 
     jsonLevel3 = jsonLevel3; 
    } 
} 

De cette façon, il n'y a pas le problème dans votre projet commun et vous êtes en mesure d'analyser le JSON.

Dans le projet c, où existe la classe JsonLevel3 , après votre désérialisation JSON dans l'objet JsonLevel, vous pouvez obtenir cette carte et désérialiser dans votre JsonLevel3.

Donc, si vous voulez lire ce JSON dans votre projet c:

{ "jsonLevel1" : { 
      "jsonLevel2" : { 
       "key1" : "value1", 
       "key2" :"value2", 
       "key3" : "value3", 
       "jsonLevel3" : { 
        "string1" : "value11", 
        "string2" : "value22" 
      } 
     } 
    }} 

Vous pouvez faire:

 Gson gson = new Gson(); 
     String filename="/pathTo/json.json"; 
     JsonReader reader = new JsonReader(new FileReader(filename)); 
     JsonLevel jsonlevel= gson.fromJson(reader, JsonLevel.class); 
     System.out.println("jsonlevel: " + gson.toJson(jsonlevel)); 

     Map<String, String> jl3 = jsonlevel.getJsonLevel1().getJsonLevel2().getJsonLevel3(); 
     /*for (Map.Entry<String, String> entry : jl3.entrySet()) 
     { 
      System.out.println(entry.getKey() + "/" + entry.getValue()); 
     }*/ 
     JsonLevel3 jlev3=gson.fromJson(gson.toJson(jl3), JsonLevel3.class); 
     System.out.println("jlev3: " + gson.toJson(jlev3)); 

Avec, bien sûr, classe JsonLevel égale à

public class JsonLevel { 

    JsonLevel1 jsonLevel1; 

    public JsonLevel1 getJsonLevel1() { 
     return jsonLevel1; 
    } 

    public void setJsonLevel1(JsonLevel1 jsonLevel1) { 
     this.jsonLevel1 = jsonLevel1; 
    } 
} 

EDIT

Je pensais que votre dernier json avait la structure de la description de votre question. C'est pourquoi j'ai utilisé un Map<String,String> pour le JsonLevel3.

Si JsonLevel3 est pas votre dernier niveau, au lieu d'utiliser un Map<String,String>, vous pouvez utiliser un Map<String, Object>.

Par exemple, si le JSON est:

{ 
    "jsonLevel1":{ 
    "jsonLevel2":{ 
     "key1":"value1", 
     "key2":"value2", 
     "key3":"value3", 
     "jsonLevel3":{ 
     "string1":"value11", 
     "string2":"value22", 
     "jsonLevel4":{ 
      "int1":1, 
      "int2":2 
     } 
     } 
    } 
    } 
} 

JsonLevel2 sera:

public class JsonLevel2 { 
    String key1; 
    String key2; 
    String key3; 
    Map<String,Object>jsonLevel3; 

De cette façon, la valeur de la carte pourrait être tout (n'est pas obligé d'être Chaîne comme avant). Ainsi, après avoir désérialisé votre JSON, vous pouvez faire la même chose qu'avant, quel que soit le contenu de JsonLevel3:

Gson gson = new Gson(); 
    String filename="/pathTo/json.json"; 
    JsonReader reader = new JsonReader(new FileReader(filename)); 
    JsonLevel jsonlevel= gson.fromJson(reader, JsonLevel.class); 
    System.out.println("jsonlevel: " + gson.toJson(jsonlevel)); 

    Map<String, Object> jl3 = jsonlevel.getJsonLevel1().getJsonLevel2().getJsonLevel3(); 
    Map<String, Integer> jl4= (Map<String, Integer>) jl3.get("jsonLevel4"); 

    JsonLevel3 jlev3=gson.fromJson(gson.toJson(jl3), JsonLevel3.class); 
    JsonLevel4 jlev4= gson.fromJson(gson.toJson(jl4), JsonLevel4.class); 

    System.out.println("jlev3: " + gson.toJson(jlev3)); 
    System.out.println("jlev4: " + gson.toJson(jlev4)); 
+0

C'est une très belle sortie. Mais le problème est JsonLevel3 pourrait ne pas être le dernier niveau. Il peut avoir JsonLevel4 à l'intérieur. et dans la structure projet-d JsonLevel4 est différent. En fait, il y a près de 10 projets, avec une structure égale à json jusqu'au niveau 3 et ensuite c'est différent pour différents projets. Je veux garder la structure de classe commune dans un projet commun. – Deb

+1

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

+0

Juste une question. En lisant les valeurs de la carte en l'itérant. Comment puis-je distinguer Primitive et Object. – Deb