gpt4 book ai didi

java - 如何使用 gson 解析类层次结构?

转载 作者:搜寻专家 更新时间:2023-10-31 19:33:27 25 4
gpt4 key购买 nike

我有一个要与 GSON 相互转换的类层次结构。我不确定如何使用 GSON 来解决这个问题(我目前有一个 Factory 类,它查看 JSONObject 并根据键的存在或不存在调用正确的构造函数,后者又委托(delegate)一些它对父类(super class)的工作)。当我将这些对象存储在本地 SQLite 数据库中时,我使用一个整数来表示它们的类型,工厂类使用该类型来调用正确的构造函数。我在 JSON 中没有这个类型(这不是我的)。

如何根据 JSON 对象的内容告诉 GSON 为我实例化哪种类型的对象?

在下面的示例中,将 JSON 括号内的 ... 视为可能有也可能没有更多元素

这是类层次结构的分割:

有一个基本抽象类型:SuperType,带有 JSON 表示 {"ct":12345,"id":"abc123 ...}

有 2 种主要的抽象子类型:TypeA(有 json key "a")和 TypeB(有 json key “b”)

类型A

示例:{"ct":12345,"id":"abc123, "a":{...}}

TypeA 有 15 个 child (我们称这些 TypeA_ATypeA_P)。这些对象的 JSON 表示类似于 {"ct":12345,"id":"abc123, "a":{"aa":1 ...} ...}{"ct":12345,"id":"abc123, "a":{"ag":"Yo dawg I head you like JSON"...} ...}

类型 B

示例:{"ct":12345,"id":"abc123, "b":{...} ...}

TypeB 有另一个抽象子类型 (TypeB_A) 和几个 child (让我们称这些 TypeB_BTypeB_I) .这些对象的 JSON 表示为 {"ct":12345,"id":"abc123, "b":{"ba":{...} ...} ...}{"ct":12345,"id":"abc123, "b":{"bg":"Stayin alive"...} ...}

可以将它全部放入一个怪物类型中,并将每个子类型视为一个内部对象,但我最终会得到很多为空的内部成员(有点像一棵有很多 Twig 的树,无处可去)。因此,我最终会得到很多 if (something==null) 来确定我正在处理的是这些类型中的哪一种。

我查看了 TypeAdapterTypeAdapterFactory,但我仍然不确定如何处理这个问题,因为我必须查看传入的 JSON 的内容。

如何根据 JSON 对象的内容告诉 GSON 为我实例化哪种类型的对象?

谢谢。

最佳答案

有一个名为 RuntimeTypeAdapterFactory 的标准扩展 TypeAdapter这使得这很简单。

test case提供一些示例代码:

RuntimeTypeAdapterFactory<BillingInstrument> rta = RuntimeTypeAdapterFactory.of(
BillingInstrument.class)
.registerSubtype(CreditCard.class);
Gson gson = new GsonBuilder()
.registerTypeAdapterFactory(rta)
.create();

CreditCard original = new CreditCard("Jesse", 234);
assertEquals("{\"type\":\"CreditCard\",\"cvv\":234,\"ownerName\":\"Jesse\"}",
gson.toJson(original, BillingInstrument.class));
BillingInstrument deserialized = gson.fromJson(
"{type:'CreditCard',cvv:234,ownerName:'Jesse'}", BillingInstrument.class);
assertEquals("Jesse", deserialized.ownerName);
assertTrue(deserialized instanceof CreditCard);

关于java - 如何使用 gson 解析类层次结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21641022/

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