{ "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; } }
@基达
我假设您可以控制JSON输入字符串的创建方式。我认为JSON字符串格式不正确,无法对地图类型进行默认的GSON反序列化。
我已经修改了输入字符串供您考虑,这将导致非null的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类中。希望这可以帮助。无法提供完整的实现,但我认为这将是部分解决方案