gpt4 book ai didi

java - gson反序列化: Reference owner of nested object

转载 作者:行者123 更新时间:2023-11-30 11:18:39 25 4
gpt4 key购买 nike

我想为我的对象编写自定义反序列化器,但为了实现这一点,我需要访问反序列化对象的另一部分。想象一个像这样的 JSON 对象:

{
"id": 2,
"name": "circle",
"dependencies": {
"donut": "e8ed7bbd8715de2f5a85930912fcf238"
},
"someReference": {
"type": "Model",
"refersTo": "donut"
}
}

我知道如何编写适配器/解串器。我也知道如何通过前者将“e8ed7bbd8715de2f5a85930912fcf238”变成 Java 对象。我不知道并且想知道的是如何将我的“ donut ”变成“e8ed7bbd8715de2f5a85930912fcf238”或“创建期间”的最终 Java 对象。此信息位于父级的字段中,因为“someReference”对应于另一个 Java 对象。所以顶级类是一个 Owner 字段:

public class Owner {
public int id;

public String name;

public List<String, Resource> dependencies;

public MyReference someReference;
}

idnamedependencies 到目前为止一切正常。

那么:如何在反序列化过程中引用父对象呢?这可能吗?对于我正在尝试做的事情,有什么解决方法?

最佳答案

我写了一个反序列化器来做你想要的(当然如果我理解的话)。与您的要求唯一不同的是,我不知道您所说的 Reference 是什么意思,所以我改用了 String。但我认为您可以轻松调整我的代码。

我的所有者定义:

package stackoverflow.questions.q23718183;

import java.util.*;

public class Owner {
public int id;

public String name;

public Map<String, String> dependencies;

public MyReference someReference;

@Override
public String toString() {
return "Owner [id=" + id + ", name=" + name + ", dependencies=" + dependencies + ", someReference=" + someReference + "]";
}

public static class MyReference {
String type;
String refersTo;

@Override
public String toString() {
return "MyReference [type=" + type + ", refersTo=" + refersTo + "]";
}

}

}

我的反序列化器:

package stackoverflow.questions.q23718183;

import java.io.IOException;
import java.lang.reflect.Type;
import java.util.*;

import com.google.gson.*;
import com.google.gson.stream.*;
import com.google.gson.reflect.TypeToken;

public class OwnerDeserializer implements JsonDeserializer<Owner> {

@Override
public Owner deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
if (json == null)
return null;
else {
Owner owner = new Owner();
JsonObject jo = json.getAsJsonObject();

owner.id = jo.get("id").getAsInt();
owner.name = jo.get("name").getAsString();

TypeToken<Map<String, String>> mapType = new TypeToken<Map<String, String>>() {};
owner.dependencies = context.deserialize(jo.get("dependencies"), mapType.getType());

Owner.MyReference reference = new Owner.MyReference();
JsonObject jo2 = jo.get("someReference").getAsJsonObject();
reference.type = jo2.get("type").getAsString();
reference.refersTo = owner.dependencies.get(jo2.get("refersTo").getAsString());

owner.someReference = reference;

return owner;
}
}
}

我的测试代码:

package stackoverflow.questions.q23718183;

import com.google.gson.*;

public class Q23718183 {

public static void main(String[] args) {
String s = " { "+
" \"id\": 2, "+
" \"name\": \"circle\", "+
" \"dependencies\": { "+
" \"donut\": \"e8ed7bbd8715de2f5a85930912fcf238\" "+
" }, "+
" \"someReference\": { "+
" \"type\": \"Model\", "+
" \"refersTo\": \"donut\" "+
" } "+
"}";

GsonBuilder b = new GsonBuilder();
b.registerTypeAdapter(Owner.class, new OwnerDeserializer());
Gson g = b.create();

Owner o = g.fromJson(s, Owner.class);

System.out.println(o);


}

}

这是结果:

Owner [id=2, name=circle, dependencies={donut=e8ed7bbd8715de2f5a85930912fcf238}, someReference=MyReference [type=Model, refersTo=e8ed7bbd8715de2f5a85930912fcf238]]

如您所见,donut 被其值替换为 dependencies 节点。

关于java - gson反序列化: Reference owner of nested object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23718183/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com