我在使用GSON时遇到了一些麻烦,主要是从JSON反序列化。
我有以下JSON:
{
"1" : {
"name" : "NAME",
"admins" : {
"1": {
"name2" : "NAME2",
"admins2" : {
"1": { ... },
"2": { ... },
......
"n": { ... }
}
},
"2": { ... },
"3": { ... },
......
"n": { ... }
}
},
"2" : { ... },
"3" : { ... },
......
"n" : { ... }
}
我需要找到用json表示json的类,我的问题是“id”(由“n”相关整数嵌套表示)
答案 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 ;
}
}