gpt4 book ai didi

java - 适用于任何对象的自定义 JSON 序列化包装器

转载 作者:行者123 更新时间:2023-12-02 00:57:34 28 4
gpt4 key购买 nike

我使用外部应用程序,它需要一个可以从我这里序列化的对象,就像他的函数一样:

externalFunction(Object input);

因此,我应该为该函数提供一个输入,当调用该方法时(不受我控制),该输入将正确序列化为 JSON。

但我不知道数据是如何构造的,因为我动态地从另一个外部应用程序接收输入。所以情况是这样的:

1.从第三方获取数据

2. MyApp 应该为 Json 序列化注释数据

3.将数据作为输入发送给第三方

4.响应将生成为 JSON

我怎样才能实现这个目标?如何在调用函数时向正确序列化的函数提供输入?

到目前为止我尝试过的:

所以我尝试的第一件事是使用一些包装器来包装数据,例如:

public class JsonWrapper<T> implements Serializable
{
public T attributes;

public JsonWrapper( T attributes )
{
this.attributes = attributes;
}

@JsonValue
public T getAttributes( )
{
return attributes;
}
}

所以我将数据包装为 ->

data = getFromThirdParty();
wrapped = new JsonWrapper<>(data);
externalFunction(wrapped);

但它产生了一个带有我不想要的“属性”字段的响应。我还尝试使用 @JsonUnwrapped public T 属性; 但结果是相同的。

我不想要这个:

{
"attributes": {
... some fields/values that I don't know, get from 3rd party
}
}

我想要这样的:

{
... some fields/values that I don't know, get from 3rd party
}

最佳答案

@JsonUnwrappedTCollection 时,注释不起作用(请参阅 Jackson 创建者的 answer)。但是@JsonValue注释实际上起到了作用:

public class JsonWrapper<T> {

@JsonValue
private T value;

public JsonWrapper(T value) {
this.value = value;
}

public T getValue() {
return value;
}
}

如果您使用Lombok ,你可以拥有:

@Getter
@AllArgsConstructor
public class JsonWrapper<T> {

@JsonValue
private T value;
}
<小时/>

示例

考虑下面的类:

@Data
@AllArgsConstructor
public class Person {
private String firstName;
private String lastName;
}

序列化 Person 实例时,会生成以下结果 JSON:

ObjectMapper mapper = new ObjectMapper();
JsonWrapper<?> wrapper = new JsonWrapper<>(new Person("John", "Doe"));
String json = mapper.writeValueAsString(wrapper);
{"firstName":"John","lastName":"Doe"}

序列化 Person 实例列表时,会生成以下结果 JSON:

ObjectMapper mapper = new ObjectMapper();
JsonWrapper<?> wrapper = new JsonWrapper<>(
Arrays.asList(
new Person("John", "Doe"),
new Person("Jane", "Poe")
));
String json = mapper.writeValueAsString(wrapper);
[{"firstName":"John","lastName":"Doe"},{"firstName":"Jane","lastName":"Poe"}]

关于java - 适用于任何对象的自定义 JSON 序列化包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57801859/

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