使用gson嵌套解析Json
我在使用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”关于相关代表整数嵌套)
我假设你想要一种方法来存储整数的键。
你想要一种使用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 ;
}
}
非常感谢很多人!这非常有用! – 2011-12-29 18:11:53
我相信你最好的选择是使用地图来允许动态密钥。例如:
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)。
复合变相^^ – MahdeTo 2011-12-29 14:18:06
你能更具体吗?我们也不知道字典的id。究竟yopu想要达到什么?你有什么问题? – 2011-12-29 13:40:31
我找不到类用json代表那个json,而且“id”是每个字典的关键字 – 2011-12-29 13:45:55