Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java gson反序列化:嵌套对象的引用所有者_Java_Json_Nested_Deserialization_Gson - Fatal编程技术网

Java gson反序列化:嵌套对象的引用所有者

Java gson反序列化:嵌套对象的引用所有者,java,json,nested,deserialization,gson,Java,Json,Nested,Deserialization,Gson,我想为我的对象编写一个自定义反序列化程序,但为了实现这一点,我需要访问反序列化对象的另一部分。想象一个JSON对象,如下所示: { "id": 2, "name": "circle", "dependencies": { "donut": "e8ed7bbd8715de2f5a85930912fcf238" }, "someReference": { "type": "Model", "refersTo":

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

{
    "id": 2,
    "name": "circle",
    "dependencies": {
        "donut": "e8ed7bbd8715de2f5a85930912fcf238"
    },
    "someReference": {
        "type": "Model",
        "refersTo": "donut"
    }
}
我知道如何编写适配器/反序列化程序。我还知道如何通过前者将“e8ed7bbd8715de2f5a85930912fcf238”转换为Java对象。我不知道也不想知道的是如何将我的“甜甜圈”转换为“e8ed7bbd8715de2f5a85930912fcf238”或最终的Java对象“在”创建过程中。此信息位于父对象的字段中,因为“someReference”对应于另一个Java对象。因此顶级类是一个
所有者
,包含以下字段:

public class Owner {
    public int id;

    public String name;

    public List<String, Resource> dependencies;

    public MyReference someReference;
}
公共类所有者{
公共int id;
公共字符串名称;
公共列表依赖关系;
公共MyReference-someReference;
}
id
name
依赖项
到目前为止都有效


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

我编写了一个反序列化程序,它可以满足您的需要(当然,如果我理解的话)。与你所问的唯一不同的是,我不知道你所说的
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 + "]";
        }

    }

}
这就是结果:

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

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

Nice!但这太糟糕了,因为我不想在自己的柴油机中摸索来完成这项任务。我更喜欢一个MyReferenceDeserializer,它可以获得一个所有者作为引用(或者只是它所在的当前“上下文”的JsonTree)。类似于
context.getParentNode().get(“依赖项”).get(“甜甜圈”)
我想我没有其他选择了。
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]]