任何对象的自定义 JSON 序列化包装器



我使用外部应用程序,它期望一个可序列化的对象,就像他的函数一样:

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;但结果是一样的。

我不要这个:

{
"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
}

TCollection时,@JsonUnwrapped注释不起作用(请参阅杰克逊创建者的回答(。但是@JsonValue注释实际上可以解决问题:

public class JsonWrapper<T> {
@JsonValue
private T value;
public JsonWrapper(T value) {
this.value = value;
}
public T getValue() {
return value;
}
}

如果您使用龙目岛,您可以拥有:

@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"}]

最新更新