[英]How to deserialize json string into object
{
"LocalLocationId [id=1]":{
"type":"folderlocation",
"id":{
"type":"locallocationid",
"id":1
},
"parentId":{
"type":"locallocationid",
"id":0
},
"name":"Test",
"accessibleToUser":true,
"defaultLocation":false,
"timezoneId":"Asia/Calcutta",
"children":[]
},
"LocalLocationId [id=0]":{
"type":"folderlocation",
"id":{
"type":"locallocationid",
"id":0
},
"parentId":null,
"name":"Locations",
"accessibleToUser":false,
"defaultLocation":false,
"timezoneId":"Asia/Calcutta",
"children":[{
"type":"locallocationid",
"id":1
}]
},
"allAllowedChildren":[{
"type":"locallocationid",
"id":1
}]
}
如何將上述字符串反序列化為 java 對象。
我使用的類是
public class Tree {
@SerializedName("allAllowedChildren")
private List<Id> allAllowedChildren;
@SerializedName("LocalLocationId")
private Map<String, LocalLocationId> localLocationId;
public class LocalLocationId {
@SerializedName("type")
private String type;
@SerializedName("name")
private String name;
@SerializedName("accessibleToUser")
private boolean accessibleToUser;
@SerializedName("defaultLocation")
private boolean defaultLocation;
@SerializedName("timezoneId")
private String timezoneId;
@SerializedName("id")
private Id id;
@SerializedName("parentId")
private Id parentId;
@SerializedName("children")
private List<Id> children;
public String getType() {
return type;
}
public String getName() {
return name;
}
public boolean isAccessibleToUser() {
return accessibleToUser;
}
public boolean isDefaultLocation() {
return defaultLocation;
}
public String getTimezoneId() {
return timezoneId;
}
public Id getId() {
return id;
}
public Id getParentId() {
return parentId;
}
public List<Id> getChildren() {
return children;
}
}
public class Id {
private String type;
private Integer id;
public String getType() {
return type;
}
public Integer getId() {
return id;
}
}
public List<Id> getAllAllowedChildren() {
return allAllowedChildren;
}
public Map<String, LocalLocationId> getLocalLocationId() {
return localLocationId;
}
}
@Kedar
我假設您可以控制 JSON 輸入字符串的創建方式。 我認為對於 Map 類型的默認 GSON 反序列化,JSON 字符串的格式不正確。
我已經修改了輸入字符串供您考慮,這導致非空 LocalLocationId
{
"LocalLocationId":[
[
"1",
{
"type":"folderlocation",
"id":{
"type":"locallocationid",
"id":1
},
"parentId":{
"type":"locallocationid",
"id":0
},
"name":"Test",
"accessibleToUser":true,
"defaultLocation":false,
"timezoneId":"Asia/Calcutta",
"children":[]
}
],
[
"2",
{
"type":"folderlocation",
"id":{
"type":"locallocationid",
"id":0
},
"parentId":null,
"name":"Locations",
"accessibleToUser":false,
"defaultLocation":false,
"timezoneId":"Asia/Calcutta",
"children":[{
"type":"locallocationid",
"id":1
}]
}
]
],
"allAllowedChildren":[{
"type":"locallocationid",
"id":1
}]
}
如果我對輸入字符串的假設不正確,請發表評論。
編輯 1:由於無法修改輸入,請考慮編寫自定義解串器。 下面是注冊自定義反序列化類的方法
GsonBuilder gsonb = new GsonBuilder();
gsonb.registerTypeAdapter(Tree.class, new TreeDeserializer());
Gson gson = gsonb.create();
下面是 TreeDeserializer
public class TreeDeserializer implements JsonDeserializer<Tree> {
public Tree deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context) throws JsonParseException {
Tree out = new Tree();
if (json != null) {
JsonObject obj = json.getAsJsonObject();
Set<Map.Entry<String,JsonElement>> entries = obj.entrySet();
for (Map.Entry<String, JsonElement> e: entries) {
if (e.getKey().equals("allAllowedChildren")) {
Type ft = List.class;
System.out.println(context.deserialize(e.getValue(), ft));
// TODO add this back into the Tree out object
} else {
// LocalLocationId
System.out.println(e.getKey());
System.out.println(context.deserialize(e.getValue(), Tree.LocalLocationId.class));
// TODO add this back into the Tree out object
}
}
}
return out;
}
}
這是 Sysouts 的控制台輸出。
LocalLocationId [id=1]
org.test.StackOverflowAnswers.Tree$LocalLocationId@464bee09
LocalLocationId [id=0]
org.test.StackOverflowAnswers.Tree$LocalLocationId@f6c48ac
[{type=locallocationid, id=1.0}]
org.test.StackOverflowAnswers.Tree@589838eb
我已將 TODO 留在反序列化器中,您需要在其中編寫自定義代碼以將反序列化中的值注入剛剛創建的 Tree 類中。 希望這可以幫助。 無法提供完整的實現,但我認為這將是一個部分解決方案
用戶 JSONParser 這是更快的一個。
下面是示例。 如果你谷歌,可以有一個更好的例子。 希望這可以幫助。
JSONParser parser=new JSONParser();
System.out.println("=======decode=======");
String s="[0,{\"1\":{\"2\":{\"3\":{\"4\":[5,{\"6\":7}]}}}}]";
Object obj=parser.parse(s);
JSONArray array=(JSONArray)obj;
System.out.println("======the 2nd element of array======");
System.out.println(array.get(1));
System.out.println();
JSONObject obj2=(JSONObject)array.get(1);
System.out.println("======field \"1\"==========");
System.out.println(obj2.get("1"));
s="{}";
obj=parser.parse(s);
System.out.println(obj);
s="[5,]";
obj=parser.parse(s);
System.out.println(obj);
s="[5,,2]";
obj=parser.parse(s);
System.out.println(obj);
您可以使用 Gson ..
String json = "Your json string "
Tree treeObj= new Gson().fromJson(json, Tree .class);
您可以使用 Jackson 的ObjectMapper
-
Tree deserializedTree = new ObjectMapper().readValue(jsonStringOfTree, Tree.class);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.