我使用外部应用程序,它期望一个可序列化的对象,就像他的函数一样:
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
}
当T
是Collection
时,@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"}]