在Java中使用Jackson json库,是否可以执行以下操作:
public class MyObject {
@JsonRawValue
@JsonUnwrapped
private String rawJson;
}
public class DTO {
public MyObject json;
}
rawJson示例:
{
"key": "value"
}
当DTO被序列化并呈现为json时,我希望JSON看起来像:
{
"dto": {
"key":"value"
}
}
相反,它总是:
{
"dto":{
"rawJson":{
"key":"value"
}
}
}
基本上似乎当你的一个属性是存储在带有@JsonRawValue的字符串中的JSON值时,@ JsonUnwrapped不起作用。
理想情况下,我在MyObject类而不是DTO级别寻找序列化解决方案,否则我不仅要将解决方案应用于DTO,还要将其他DTO应用于引用MyObject的所有其他DTO。
更新
以下答案在一个位置解决了这个问题,但在以下场景中仍然存在问题;
public class DTO2 {
@JsonUnwrapped
public MyObjectAbstract json2;
}
MyObject是MyObjectAbstract的扩展,当DTO2 MyObjectAbstract是MyObject的一个实例时,我喜欢将DTO2简单地序列化为:
{
"key": "value"
}
问题在于,每当DTO2.MyObjectAbstract是MyObject的一个实例时,它都被序列化为:
{
"json": {
"key": "value"
}
}
答案 0 :(得分:1)
您可以在getter方法上使用JsonRawValue
和JsonValue
注释。这是一个例子:
public class JacksonUnwrapped {
static class MyObject {
private String rawJson;
MyObject(final String rawJson) {
this.rawJson = rawJson;
}
@JsonRawValue
@JsonValue
String getRawJson() {
return rawJson;
}
}
static class DTO {
public MyObject json;
DTO(final MyObject json) {
this.json = json;
}
}
public static void main(String[] args) throws JsonProcessingException {
final ObjectMapper objectMapper = new ObjectMapper();
final DTO dto = new DTO(new MyObject(
"{\"key\": \"value\"}"));
System.out.println(objectMapper
.writerWithDefaultPrettyPrinter()
.writeValueAsString(dto));
}
}
输出:
{
"json" : {"key": "value"}
}