2015-09-06 87 views
0

我有以下JSON文件:如何使用google gson庫將帶有內部對象的json對象反序列化爲單個java對象?

{ 
    "sqldb": [ 
    { 
     "name": "mydb", 
     "label": "sqldb", 
     "plan": "sqldb_free", 
     "credentials": { 
     "port": 50000, 
     "db": "SQLDB", 
     "username": "xxxxxxx", 
     "host": "75.126.155.92", 
     "hostname": "75.126.155.92", 
     "jdbcurl": "jdbc:db2://75.126.155.92:50000/SQLDB", 
     "uri": "db2://xxxxxxx:[email protected]:50000/SQLDB", 
     "password": "xxxxxxx" 
     } 
    } 
    ] 
} 

的對象還具有以下結構:sqldb對象列表,其具有內部credentials對象。我怎樣才能將Google Gson library解析成單個的sqldb對象?我的意思是,可以通過使用GSON的註解,Java對象像下面創建:

public class VcapObject{ 
    private String name; 
    private String label; 
    private String plan; 
    private String port; 
    private String db; 
    private String username; 
    private String host; 
    private String hostname; 
    private String jdbcurl; 
    private String uri; 
    private String password; 
} 

將由填寫:

VcapObject vcapObject = gson.fromJson(vcapString, VcapObject.class); 

例如?

+0

是否有可能因爲你需要設置這個計劃中的結構與類VcapObject修改JSON?就像---- {「name」:「mydb」,「label」:「sqldb」,「plan」:「sqldb_free」,「port」:50000,「db」:「SQLDB」,「username」:「 XXXXXXX 「 」宿主「: 」75.126.155.92「, 」主機名「: 」75.126.155.92「, 」JDBCURL「: 」JDBC:DB2://75.126.155.92:50000/SQLDB「, 」URI「:」 DB2: //xxxxxxx:[email protected]:50000/SQLDB","password":"xxxxxxx「} – Saurabh

+0

目前還不清楚你實際需要什麼。 – Pepster

回答

-1

您可以創建包含VcapObject集合的包裝類,例如VcapList。然後,您可以將VcapList作爲類傳遞給fromJson。向VcapList添加一個方法,如果不是空的,則獲取第一個方法。

+0

你不理解我,我想擺脫內部對象的'credentials',將所有參數填充到單個對象'VcapObject'中。它不會打擾我將'VcapObject'對象的集合存儲在'List'中 – Anatoly

+0

也許你應該在你的問題中陳述這個註釋...... – Pepster

0

要擺脫內部credentials對象,您需要一個自定義JsonDeserializer,將內部類的字段複製到外部類。有幾種不同的策略可以採用,但是這裏是修改JSON樹並將其反饋給Gson的策略。

Gson gson = new GsonBuilder().registerTypeAdapter(VcapObject.class, new VcapDeserializer()).create(); 

注意事項 - -

public class VcapDeserializer implements JsonDeserializer<VcapObject> { 

    private static final String MERGE_FIELD = "credentials"; 
    final private Gson gson; 

    public VcapDeserializer() { 
     gson = new Gson(); 
    } 

    @Override 
    public VcapObject deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { 
     if(json.isJsonObject()) { 
      JsonObject jsonObject = json.getAsJsonObject(); 
      if(jsonObject.has(MERGE_FIELD)) { 
       // We have the object, get all the fields 
       JsonObject mergeObject = jsonObject.get(MERGE_FIELD).getAsJsonObject(); 
       Set<Map.Entry<String, JsonElement>> entries = mergeObject.entrySet(); 
       for(Map.Entry<String, JsonElement> entry : entries) { 
        // Copy property to top level object 
        jsonObject.add(entry.getKey(), entry.getValue()); 
       } 
       // now that we have copied the fields, remove the nested object 
       jsonObject.remove(MERGE_FIELD); 
      } 
      // Deserialize the top-level object 
      return gson.fromJson(jsonObject, VcapObject.class); 
     } else { 
      // top level is supposed to be an object 
      throw new IllegalStateException(); 
     } 
    } 
} 

然後用GsonBuilder創建自定義Gson例如從你的問題,如果你想擺脫頂級包裝對象的,目前尚不清楚。我假設不是因爲你沒有說數組總是要返回一個元素。所以,你仍然需要的是 -

public class SqlDbWrapper { 
    List<VcapObject> sqldb; 
} 

,然後用反序列化 -

SqlDbWrapper sqlDbWrapper = gson.fromJson(jsonString, SqlDbWrapper.class);