2011-12-29 128 views
1

我在使用GSON时遇到了一些麻烦,主要是从JSON反序列化。使用gson嵌套解析Json

我有以下的JSON:

{ 
    "1" : { 
     "name" : "NAME", 
     "admins" : { 
      "1": { 
       "name2" : "NAME2", 
       "admins2" : { 
        "1": { ... }, 
        "2": { ... }, 
        ...... 
        "n": { ... } 
       } 
      }, 
      "2": { ... }, 
      "3": { ... }, 
      ...... 
      "n": { ... } 
     } 
    }, 
    "2" : { ... }, 
    "3" : { ... }, 
    ...... 
    "n" : { ... } 
} 

我需要找到类代表与GSON是JSON,我的问题是“ID”(由“N”关于相关代表整数嵌套)

+0

你能更具体吗?我们也不知道字典的id。究竟yopu想要达到什么?你有什么问题? – 2011-12-29 13:40:31

+0

我找不到类用json代表那个json,而且“id”是每个字典的关键字 – 2011-12-29 13:45:55

回答

0

我假设你想要一种方法来存储整数的键。
你想要一种使用Json字符串的方式。由于它们是整数,可以有钥匙

1,2,3....n 

“n”的数量和每个按键都会有它的值。

一种方法是使用HashMap。

键以整数形式存储在地图中。
无限数量的钥匙可以使用。
轻松遍历键值对。
可轻松扩展以添加不同的对象。

/*Here we do the following steps 
* 1. create the data 
* 2. convert data to Json String using GSON 
* 3. JSon String is used to populate the data bean using GSON. 
* 
* Integers will be used as the key. 
*/ 
public class CreateAccessGSON() 
{ 
    public static void main(String[] args) 
    { 

     Gson gson = new Gson(); //instantiate gson here. 

     //Creating the Data Object. 
     HashMap<Integer,AdminBean> tmpAdminMap = new HashMap<Integer,AdminBean>(); 

     AdminBean adminOne1 = new AdminBean(); 
     adminOne1.setName("Joe"); 

     tmpAdminMap.put(1,adminOne1); // key is an Integer 1 

     AdminBean adminOne2 = new AdminBean(); 
     adminOne2.setName("Blow"); 

     tmpAdminMap.put(2,adminOne2); // key is an Integer 2 

     //Set the value of the Map. 
     DataObjectBean dataObjectBean = new DataObjectBean(); 
     dataObjectBean.setAdminMap(tmpAdminMap); 

     String jsonString = gson.toJson(dataObjectBean); 

     System.out.println(jsonString); // print the Json String. 
      //Output will be as follows 
     /* 
      { 
      "adminMap" : 
        { 
         "1" : {"name":"Joe"} , 
         "2" : {"name":"Blow"} 
        } 
      } 
     */ 




     // Code to Convert Json String to the Associated object. 
      DataObjectBean accessDataObjectBean = gson.fromJson(jsonString ,DataObjectBean); 
      HashMap<Integer,AdminBean> retrieveAdminMap = accessDataObjectBean.getAdminMap(); 
      System.out.println(retrieveAdminMap.get(1).getName()); // Joe 
      System.out.println(retrieveAdminMap.get(2).getName()); // Blow 

      //get number of keys, we use the hashmap size. 
      System.out.println("Num of keys : " + retrieveAdminMap.size()); // Num of keys : 2 

      // You can use the Java Iterator to access each key and their values 
      Set<Integer> setKey = retrieveAdminMap.keySet(); 
      for(Integer keys : setKey) 
      { 
       AdminBean eachAdmin = retrieveAdminMap.get(keys); 
       System.out.println(eachAdmin.getName()); 
      } 
    } 
} 



//This class will store the Admin data. You can have more nested classes here. 
// This class can further have more maps. 
public class AdminBean 
{ 
    private String name = ""; 

    public String getName() 
    { 
     return name; 
    } 

    public String setName(String name) 
    { 
     this.name = name; 
    } 
} 

// This main Java Bean which will be used to generate the JSON. 
// Since we need as Integer as key, we use the HashMap to store it. 
// HashMaps will allow storing unlimited Integers. 
public class DataObjectBean{ 
    private HashMap<Integer,AdminBean> adminMap = new HashMap<Integer,AdminBean>(); 
    public String getAdminMap() 
    { 
     return adminMap ; 
    } 

    public String setAdminMap (String adminMap) 
    { 
     this.name = adminMap ; 
    } 
} 
+0

非常感谢很多人!这非常有用! – 2011-12-29 18:11:53

0

我相信你最好的选择是使用地图来允许动态密钥。例如:

public class JSWrapper { 
public HashMap<String, JSMessage> messages; 

public static class JSMessage { 

    public String name; 
    public Admins admins; 
    } 

    public static class Admins { 
      ... 
    } 
} 

看起来您的JSON具有递归结构,尽管从您的示例中不完全清楚。如果您的姓名和管理员密钥不同,最终被命名为namesn和adminsn,那么您将需要在Map中将这些密钥表示为密钥。我不确定Gson是否可以允许这种递归结构,但我相信Google Maps将解决您所问的动态关键问题。

当然,一旦数据出现在地图中,它就取决于您的代码以了解可以使用哪些数据(1,2,... n)。

+0

复合变相^^ – MahdeTo 2011-12-29 14:18:06