用gson嵌套解析Json

时间:2011-12-29 13:33:45

标签: java json gson

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

我有以下JSON:

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

我需要找到用json表示json的类,我的问题是“id”(由“n”相关整数嵌套表示)

2 个答案:

答案 0 :(得分: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是否允许这种递归结构,但我相信Maps会解决你所询问的动态密钥问题。

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

答案 1 :(得分:0)

我假设您想要一种存储整数键的方法 您想要一种使用Json String的方法。由于它们是整数,因此可以有“n”个键

1,2,3....n

并且每个键都有它的值。

一种方法是使用HashMap。

键存储在Map as Integers中。
可以使用无限数量的钥匙 轻松遍历键值对。
轻松扩展以添加不同的对象。

/*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 ;
    }
}