结构不固定的 json 值要怎么反序列化成对象比较好?

2021-09-01 14:12:17 +08:00
 x97bgt

json 里面有互斥的字段,要怎么序列化成对象?

比如下面的例子里,要么只有refund字段,要么只有purchase,而且两个字段里的结构是不一样的。

{
    "id": "1234567890",
    "amount": 100,
    "refund": {
        "date": "2021-04-23T18:25:43.511Z",
        "confirmed": true,
        "refund_id": 1234456
    }
}

{
    "id": "1234567890",
    "amount": 100,
    "purchase": {
        "date": "2021-04-23T18:25:43.511Z",
        "purchase_id": 789621
    }
}

现在到的最粗暴的办法,是把每个字段都塞进对象。但这太难看了,而且容易造成混乱。

这种结构下,要怎么设计对象的结构比较好?

3054 次点击
所在节点    Java
34 条回复
bnm965321
2021-09-01 16:17:15 +08:00
union type. 在 TS 里面也能很简单的处理
x97bgt
2021-09-01 16:31:50 +08:00
@binux 但是方法的返回值就只有一个类型啊。。
ysc3839
2021-09-01 17:07:09 +08:00
如果是 C++ 的话,我会选择定义两个 struct,然后用 std::variant 。
goHomeAdmin
2021-09-01 17:07:12 +08:00
data {
type_1: {},
type_2: {},
}

protobuf 中的 one of 使用
ysc3839
2021-09-01 17:11:22 +08:00
Java 的话,我会选择把两个字段都写进去,允许 null 。
codingadog
2021-09-01 17:23:56 +08:00
这不是用一个类就能解决的么
passerbytiny
2021-09-01 17:32:46 +08:00
你这个不管对应到类还是对应到关系数据,都是两种数据类型,这就不要再想反序列化成一个类了。
passerbytiny
2021-09-01 17:36:14 +08:00
这种结构不稳定的数据格式,是符合 JSON 规范和接口数据规范的,但不符合面向对象数据格式,建议不要做反序列化,直接当成 JSON 读取,用 jsonpath 的形式
jiorix
2021-09-01 17:57:17 +08:00
类设计可以更抽象点,建议把差异的字段抽象为值。
james2013
2021-09-01 20:14:18 +08:00
{
"id": "1234567890",
"amount": 100,
"refund": {
"date": "2021-04-23T18:25:43.511Z",
"confirmed": true,
"refund_id": 1234456
}
"purchase": {
"date": "2021-04-23T18:25:43.511Z",
"purchase_id": 789621
}
}

{
"id": "1234567890",
"amount": 100,
"purchase": {
"date": "2021-04-23T18:25:43.511Z",
"purchase_id": 789621
}
}
james2013
2021-09-01 20:15:43 +08:00
类中放 refund 和 purchase2 个子类就可以了
lululau
2021-09-01 22:39:29 +08:00
class RootEnt {
String id;
int amount;
RefundEnt refund;
PurchaseEnt pruchase;
}
mingl0280
2021-09-02 04:07:46 +08:00
class Json
{
string id;
int amount;
Purchase purchase;
Refund refund;
};
rububio
2021-09-02 13:15:06 +08:00
当然是用 Discriminate Union 啊。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/799259

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX