gpt4 book ai didi

java - 使用 Spring 反序列化请求时如何处理动态 JSON 值类型?

转载 作者:行者123 更新时间:2023-12-02 05:17:53 26 4
gpt4 key购买 nike

我正在尝试为我们公司用来通过 Spring 与其 API 进行交互的软件创建一个包装器。

现在,该软件的 API 返回一个平面 JSON 对象作为 GET 请求的响应。我面临的问题是取决于我们正在抓取的字段之一是否有数据,这将确定响应中的值是 String 还是 JSON 对象。

在 Spring 中创建模型时如何处理这种动态数据类型?

当只是使用数据时,如果该特定字段的数据为空,并且我在模型中将数据类型设置为 String,我可以将其反序列化为我的 结果对象。

当该特定字段有数据时,反之亦然。我创建了一个名为 LinkValueObject 的自定义对象,它只包含 2 个属性 linkvalue。当我在该字段有数据时发出请求时,我再次能够正确反序列化它。我只是不确定如何动态处理这两种情况。

如果我用错了术语,我深表歉意。

“assigned_to”中没有数据的响应示例:

{
"result": {
"name": "Bob Ross",
"assigned_to": ""
}
}

“assigned_to”中包含数据的响应示例:

{
"result": {
"name": "Bob Ross",
"assigned_to": {
"link": "https://mylink.com",
"value": "qwerty123456"
}
}
}

我的模型现在看起来像这样:

// Using Lombok to auto-generate getters/setters

@Data
@NoArgsConstructor
@JsonInclude("JsonInclude.Include.NON_NULL")
public class Result {
@JsonProperty("name")
private String name;

// This will handle if assigned_to returned as a JSON object
// If assigned_to was empty, it would return as an empty string
// and cause this to bomb out until the Data type was String again

@JsonProperty("assigned_to")
private LinkValueObject assignedTo;
}

最佳答案

您可以使用Declarative Stream Mapping (DSM)流解析库轻松做到这一点。

首先,您必须以 yaml 或 JSON 格式定义 JSON 数据和字段之间的映射。

以下是映射定义:

result:     
type: object
path: /result
fields:
name:
assignedTo:
type: object
path: assigned_to
filter: self.data.link!=null # if link value is null filter assignedTo field fields:
link:
value:

您要反序列化的Java类(与您的类相同):

public class Result {
public String name;
public LinkValueObject assignedTo;

@Override
public String toString() {
return "Result [name=" + name + ", assignedTo=" + assignedTo + "]";
}
public static class LinkValueObject{
public String link;
public String value;
@Override
public String toString() {
return "LinkValueObject [link=" + link + ", value=" + value + "]";
}
}
}

解析 JSON 的 Java 代码:

DSM dsm=new DSMBuilder(new File("path/to/mapping.yaml")).create(Result.class);
Result result= (Result)dsm.toObject(jsonData);

System.out.println(object);

这是输出:

第一个输入:

{
"result": {
"name": "Bob Ross",
"assigned_to": ""
}
}

第一个输出:

Result [name=Bob Ross, assignedTo=null]

第二个输入:

{
"result": {
"name": "Bob Ross",
"assigned_to": {
"link": "https://mylink.com",
"value": "qwerty123456"
}
}
}

第二个输出:

Result [name=Bob Ross, assignedTo=LinkValueObject [link=https://mylink.com, value=qwerty123456]]

关于java - 使用 Spring 反序列化请求时如何处理动态 JSON 值类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56283244/

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