2014-07-16 69 views
1

我正在使用GSON libray解析的JSON數據。有小問題,需要專家的指導。使用GSON解析JSON數據

{"Values":{"Items":[{"Key":"LastUpdateLabel","Value":"Last Update"}]}} 

public class Values { 
    private List<Item> Items; 

    /** 
    * @return the items 
    */ 
    public List<Item> getItems() { 
     return Items; 
    } 

    /** 
    * @param items 
    *   the items to set 
    */ 
    public void setItems(List<Item> items) { 
     Items = items; 
    } 

} 

final Values val = new Gson().fromJson(res, Values.class); 
List<Item> items = val.getItems(); 
Log.i(TAG, "Val size = " + items.size()); 

if (items != null && !items.isEmpty()) { 
    for (Item item : items) { 
     Log.i(TAG, "Key = " + item.getKey()); 
     Log.i(TAG, "Value = " + item.getValue()); 
    } 
} 

但它不工作。任何人都可以幫助我理解這一點,因爲我是GSON的新手。

+0

plz發佈logcat –

+0

我在獲取NullPointer異常時訪問項目列表。基本上它不解析JSON數據。 – Scorpion

+0

如果Gson無法解析該字符串,它將拋出一個異常,也許你正在捕獲該異常而沒有警告。 –

回答

1

需要使用另一個類包含values領域:

public class JsonData { 
    private Values values; 
} 

public class Values { 
    private List<Item> items; 
} 

public class Item { 
    private String key; 
    private String value; 
} 

解析JSON,我使用GSON米,FieldNamingPolicy.UPPER_CAMEL_CASE創建的,這樣我就可以使用Java命名約定變量名:

Gson gson = new GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.UPPER_CAMEL_CASE).create(); 

JsonData val = gson.fromJson(res, JsonData.class); 

如果你不想使用FieldNamingPolicy.UPPER_CAMEL_CASE然後CHANE varlible名String KeyString Value等,但我認爲這是更好遵循Java命名約定。

+0

謝謝你的答案之後出現。它的工作。一個非常簡單的問題,請你向我解釋爲什麼我需要第三堂課嗎?這是因爲它的值爲Json對象,然後是Items,然後是數組? – Scorpion

+0

@Scorpion您可以在'Values'鍵的同一級別有許多其他鍵,例如'Values1','Values2','Values3'等。因此起初Gson尋找'Values'變量來保存那些'Values'對象,但是你沒有變量。 –

0

對於這一點,我使用com.google.api.client.json.gson.GsonFactory

public static Object parseClass(Class clazz, String object) { 
    try { 
     GsonFactory instance = GsonFactory.getDefaultInstance(); 
     return instance.fromString(object, clazz); 
    } catch (IOException e) { 
     LogUtil.loge(TAG, "Error while parsing JSON object"); 
     return null; 
    } 
} 
0

我不知道很多關於GSON/JSON的,但我已經嘗試過採取此類解析:

public static List<LevelModel> getLevels(){ 
    Gson gson = new Gson(); 
    List<LevelModel> levels; 

    String levelsJson = Gdx.files.internal("data/world/levels.json").readString(); 
    levels = Arrays.asList(gson.fromJson(levelsJson, LevelModel[].class)); 

    return levels; 
}