{
"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类中。希望这可以帮助。无法提供完整的实现,但我认为这将是部分解决方案
问题内容: 我有一些具有各种属性的JSON,其中大多数是简单数据类型。但是,我在JSON中有一个属性,当我将其反序列化为C#类时,我只需要将其反序列化为字符串即可。 JSON示例: 除了将是有效的JSON对象外,“ json”对象没有任何设置结构。 因此,在上面的示例中,“ json”的值是一个JSON对象-但是当它反序列化时,我需要将它作为字符串。 因此,如果我的C#类是: 然后,如果我使用:
我尝试从一个用于存储Spring会话的Redis服务器反序列化String到Java对象,并且我想在Spring框架之外反序列化它。我认为Spring Redis序列化器可能使用默认字符集UTF-8来将Java对象序列化为字符串。 Redis中的字符串: 错误消息: 我知道用UTF-8在Byte[]和String之间的转换很可能是问题所在,但我还是想问一下,是否有人知道如何在不修改序列化部分的情况
我的JSON如下所示: 我的课程如下所示: 如何反序列化到映射如和到
问题内容: 我有这个字符串: 我正在反序列化对象: 该对象看起来像: 并尝试创建字典: 但得到。 可能是什么问题? 问题答案: 请参阅mridula的答案,了解为什么您会得到null。但是,如果您想直接将json字符串转换为字典,则可以尝试以下代码段。
问题内容: 我有以下字符串 我想反序列化一个类的对象 我正在使用python 2.6和2.7 问题答案:
问题内容: 我正在使用以下JSON字符串 我有一个如下的类结构,用于解析和感受json数据 如何将上述JSON字符串反序列化为List? 我正在使用 Newtonsoft.Json 进行反序列化。 问题答案: 首先创建另一个类: 然后用