gpt4 book ai didi

java - 通过继承将嵌套/递归 JSON 反序列化为 Java 对象

转载 作者:行者123 更新时间:2023-12-02 10:46:47 24 4
gpt4 key购买 nike

我有一个复杂/嵌套的 json。我的 json 文件由两个等效的 java 对象组成。一个是Complex_Expression,另一个是Simple_ExpressionComplex_Expression 采用以下形式:

{
"SomeOpearator":0,
"ASpecificKey":1, //the value 1 is fixed for complex expression.
"Expressions":[ ] //array of one or more expressions
}

简单表达式采用以下形式:

{
"Operand":"Some String Value",
"ASpecificKey":0, //the value 0 is fixed for simple expressions.
"SomeComparisionOpearator":1, // enums which associates int to different comparison operators.
"Value":["String1"] //this is an array of strings.
}

表达式又可以有Complex_Expression和/或Simple_Expression。 json 文件始终从 Complex_Expression 开始。我必须反序列化这个 JSON 文件。我的最终目标是使用Complex_ExpressionSimple_Expression对象以及这些类中的一些逻辑来创建一个表达式。我不介意使用 jacksongson 或者其他依赖项。

到目前为止,我已经创建了一个名为Expression 的基类。 Complex_ExpressionSimple_Expression 都继承了这个类。然后我开始编写自定义 Json 反序列化器。但在自定义解串器中我被卡住了,我不知道应该如何继续。请帮我解决这个问题。我的 Simple_Expression 类看起来像这样,Complex_Expression 类有点相似。

public class Simple_Expression extends Expression
{
@JsonProperty("Operand") //use jackson deserializer for this class.
public String Operand;

@JsonProperty("SomeComparisionOpearator")
public SomeComparisionOpearator someCompareOperator;

@JsonProperty("Value")
public Object value;

public Simple_Expression()
{
super(ASpecificKey.Simple); //Simple corresponds to 0
}
}

更新

关于我的输入和输出的更多描述。输入给定 JSON 字符串,如下所示:

{
"SomeOpearator": 0,
"ASpecificKey": 1,
"Expressions": [
{
"SomeOpearator": 1,
"ASpecificKey": 1,
"Expressions": [
{
"Operand": "People",
"ASpecificKey": 0,
"SomeComparisionOpearator": 14,
"Value": [
"Rich"
]
}
]
},
{
"SomeOpearator": 1,
"ASpecificKey": 1,
"Expressions": [
{
"Operand": "Grade",
"ASpecificKey": 0,
"SomeComparisionOpearator": 2,
"Value": [
"Grade A"
]
}
]
}
]
}

假设 jackson 反序列化器,我应该能够做这样的事情:

ObjectMapper mapper = new ObjectMapper();
Expression myExpressionObject = mapper.convertValue(jsonString, Expression.class);

它应该将反序列化的对象提供给 myExpressionObject,该对象将由表达式列表组成(Arraylist 或 Array,没问题)。

最佳答案

使用 Gson extras RuntimeTypeAdapterFactory 这会很容易因为您有可以用作类型鉴别器的字段ASpecificKey。请参阅this供使用。如果您已经包含 Gson,则只需将源代码复制到您的项目即可。

我冒昧地修复了您的 Java 命名约定,以便类实际上看起来像这样(并且您的 JSON 也应该修复为正确的约定):

@Getter @Setter
public class Expression {
private int aSpecificKey;
}

@Getter @Setter
public class SimpleExpression extends Expression {
public SimpleExpression() {
setASpecificKey(0);
}
private String operand;
private int someComparisonOperator;
private String[] values;
}

@Getter @Setter
public class ComplexExpression extends Expression {
public ComplexExpression() {
setASpecificKey(1);
}
private String someOperator;
private Expression[] expressions;
}

针对这种 DTO,您只需实例化一个特定的 RuntimeTypeAdapterFactory:

final RuntimeTypeAdapterFactory<Expression> expressionTypeFactory = 
RuntimeTypeAdapterFactory
.of(Expression.class, "aSpecificKey")
.registerSubtype(SimpleExpression.class, "0")
.registerSubtype(ComplexExpression.class, "1")

那么反序列化就像:

Expression e = getGson(expressionTypeFactory)
.fromJson(getPackageResourceReader(YOUR_NOTATION_FIXED_JSON),
Expression.class);

请注意,Gson 默认情况下不会反序列化类型鉴别器 aSpecificKey,这就是为什么有默认构造函数来设置它。如果不需要它,可以删除默认构造函数。

关于java - 通过继承将嵌套/递归 JSON 反序列化为 Java 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52494443/

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