2011-07-22 46 views
25

我目前正在開發一個需要我調用Web服務的Android項目,該Web服務將返回一個json文件。我一直在使用GSON庫來解析所有的json文件並獲得一個JSON對象。它一直運行良好,直到我遇到這個關鍵字段是動態的json數據。這個文件的一個例子是如下:在android中使用GSON解析JSON並使用動態「key」和「value」

{ "0": { "count":"5"}, 
    "1": { "title":"...", "desc":"" }, 
    "2": { "title":"...", "desc":"" }, 
    "3": { "title":"...", "desc":"" }, 
    "4": { "title":"...", "desc":"" }, 
    "5": { "title":"...", "desc":"" }, 
    "routes": { "route1":"...", "route3":"" }, 
} 

我能夠基於「0」鍵ID來獲得計數,但我不知道我該如何利用這個值來獲得其他鍵對象(鍵ID 1-5),它由我需要的數據組成。如果有人能夠幫助我解決這個問題,我會非常感激。謝謝。

+0

我想補充說,如果你的地圖不是嵌套比事情簡單得多http://stackoverflow.com/questions/2779251/ how-can-i-convert-json-to-a-hashmap-using-gson –

回答

30

我能想到的最直接的方法就是將結構視爲MapMap)。

使用Gson,只要Map結構是靜態已知的,則每個來自根的分支具有相同的深度,並且一切都是String,這相對容易。

import java.io.FileReader; 
import java.lang.reflect.Type; 
import java.util.Map; 

import com.google.gson.Gson; 
import com.google.gson.reflect.TypeToken; 

public class GsonFoo 
{ 
    public static void main(String[] args) throws Exception 
    { 
    Gson gson = new Gson(); 
    Type mapType = new TypeToken<Map<String,Map<String, String>>>() {}.getType(); 
    Map<String,Map<String, String>> map = gson.fromJson(new FileReader("input.json"), mapType); 
    System.out.println(map); 

    // Get the count... 
    int count = Integer.parseInt(map.get("0").get("count")); 

    // Get each numbered entry... 
    for (int i = 1; i <= count; i++) 
    { 
     System.out.println("Entry " + i + ":"); 
     Map<String, String> numberedEntry = map.get(String.valueOf(i)); 
     for (String key : numberedEntry.keySet()) 
     System.out.printf("key=%s, value=%s\n", key, numberedEntry.get(key)); 
    } 

    // Get the routes... 
    Map<String, String> routes = map.get("routes"); 

    // Get each route... 
    System.out.println("Routes:"); 
    for (String key : routes.keySet()) 
     System.out.printf("key=%s, value=%s\n", key, routes.get(key)); 
    } 
} 

更具動態Map結構處理,我強烈建議切換到使用Jackson,而不是GSON,因爲傑克遜將反序列化的任意複雜的任何JSON對象轉換爲Java Map,只用一個簡單的代碼行,它會自動保留原始值的類型。

import java.io.File; 
import java.util.Map; 

import org.codehaus.jackson.map.ObjectMapper; 

public class JacksonFoo 
{ 
    public static void main(String[] args) throws Exception 
    { 
    ObjectMapper mapper = new ObjectMapper(); 
    Map map = mapper.readValue(new File("input.json"), Map.class); 
    System.out.println(map); 
    } 
} 

Gson可以達到同樣的效果,但它需要幾十行代碼。 (另外,Gson還有其他的缺點,使得切換到傑克遜非常值得。)

+0

嗨,謝謝你的解決方案!這是完美的作品。 =) – Philip

+2

在Gson目前這個作品:Map jsondata = g.fromJson(injson,Map.class); – Teddy

1

您可以使用計數獲取單個關鍵對象。所以你會得到對象「1」,然後得到它的「標題」和「desc」對象,然後是對象「2」等。

+1

我已經使用Bruce的解決方案解決了我的問題。還是要謝謝你的幫助。 =) – Philip