簡體   English   中英

用嵌套的gson解析Json

[英]parsing Json with gson nested

我在使用GSON時遇到了一些麻煩,主要是從JSON反序列化。

我有以下JSON:

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

我需要找到用gson表示json的類,我的問題是“ id”(由嵌套的“ n”個相關整數表示)

我相信您最好的選擇是使用地圖來提供動態鍵。 就像是:

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,那么您甚至需要在地圖中將其表示為密鑰。 我不確定Gson是否可以允許這種遞歸結構,但我相信Maps會解決您所要求的動態關鍵問題。

當然,一旦數據進入地圖,則取決於您的代碼來了解其中包含哪些數據(1、2,.. n)。

我假設您想要一種存儲整數的鍵的方法。
您想要一種使用Json String的方法。 由於它們是整數,因此可以有“ n”個鍵

1,2,3....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 ;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM