2014-07-16 70 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; 
}