2017-10-16 61 views
0

說我有4個項目GSON解析:在不同項目中的Bean結構

項目一, 項目B, 項目-C, 項目共同

project-common被設置爲依賴( maven)在所有其他項目。

現在每個項目都讀取單獨的json文件。

項目一,項目B讀取以下JSON

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

項目-C讀取以下:

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

我想有POJO類JsonLevel1,JsonLevel2項目常見和JavaLevel3在項目c。但是,project-common不承認JavaLevel3類(因爲project-c不是項目公用的依賴項)

我該怎麼做?

回答

1

如果我理解正確的,你有你的項目共同類:

JsonLevel1.java

public class JsonLevel1 { 
    JsonLevel2 jsonLevel2; 

} 

JsonLevel2.java

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

而且在JsonLevel2類,因爲這個項目中沒有JsonLevel3類,所以存在你的問題。

你可以這樣做。在類JsonLevel2可以插入,而不是JsonLevel3類,一個地圖:

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

以這種方式,是不是在你的項目中常見的問題,您可以解析JSON。

project-c,其中存在JsonLevel3類,在JsonLevel對象中對json進行反序列化後,您可以獲取此映射並將其反序列化到JsonLevel3中。

所以,如果你想讀此JSON在您的項目-C:

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

你可以這樣做:

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

有了,當然,JsonLevel類等於

public class JsonLevel { 

    JsonLevel1 jsonLevel1; 

    public JsonLevel1 getJsonLevel1() { 
     return jsonLevel1; 
    } 

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

編輯

我以爲你的最終json有你的問題描述的結構。這就是爲什麼我使用JsonLevel3的Map<String,String>

如果JsonLevel3不是您的最後一級,而是使用Map<String,String>,您可以使用Map<String, Object>

例如,如果JSON的是:

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

JsonLevel2將是:

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

這樣,地圖的價值是一切(是不是被迫成爲一個如前所述的字符串)。所以,在你將反序列化你的json之後,你可以做同樣的事情,以前的任何內容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

這是一個非常好的出路。但問題是JsonLevel3可能不是最後一個級別。它內部可能有JsonLevel4。並在project-d JsonLevel4結構中有所不同。實際上有近10個項目,具有相同的json結構,達到3級,然後對於不同的項目是不同的。我想保持共同項目中的共同班級結構。 – Deb

+1

@Deb我剛剛編輯了答案。 –

+0

只是一個問題。通過迭代它從地圖讀取值。我如何區分Primitive和Object。 – Deb