Разбор Json с вложенным GSON - PullRequest
1 голос
/ 29 декабря 2011

У меня возникли некоторые проблемы с GSON, в основном десериализация из JSON.

У меня есть следующий JSON:

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

Мне нужно найти класс для представления этого json с gson, моя проблема - это "id" (представленный вложенными целыми числами "n")

Ответы [ 2 ]

0 голосов
/ 29 декабря 2011

Я предполагаю, что вы хотите хранить ключи, которые являются целыми числами.
Вы хотите способ использовать 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 ;
    }
}
0 голосов
/ 29 декабря 2011

Я считаю, что вам лучше всего использовать карты, чтобы учесть динамические клавиши. Что-то вроде:

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 учесть эту рекурсивную структуру, но я верю, что Карты решат проблему динамического ключа, о которой вы спрашиваете.

Конечно, как только данные находятся на картах, ваш код должен понять, какие данные (1, 2, .. n) доступны в пределах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...