在我们的应用程序中,一个数据库表将一些结果存储为json,如下所示:
---------------------------------------------------- -------------
content | other fields...
---------------------------------------------------- --------------
"{ \"key\":[\"value1\",\"value2\",\"value3\"]}" | 12 ...
我需要获取并写入结果文件,将一组记录的content
字段作为单个json,如:
的(预期)
[
{
"content": {
"key": [
"value1",
"value2",
"value3"
]
}
}
.....
]
在对应的java实体中,我为@JsonIgnore
以外的所有字段添加了content
。
class Result{
//@JsonIgnore
//otherfields
....
@Column("content")
private String content;//the json string field
....
}
但是当我从db读取并使用:
写入文件时ObjectWriter writer = new ObjectMapper().writer().withDefaultPrettyPrinter();
writer.writeValue(new File(outFile), entityList);
我得到的文件为: 的(原文)
[
{
"content" : "{ \"key\":[\"value1\",\"value2\",\"value3\"]}"
}
....
]
您可能会注意到这个问题。它将jason字段作为字符串,并将其作为关键字“content”的值,而不是预期的嵌套jason
答案 0 :(得分:1)
根据How can I include raw JSON in an object using Jackson?,您可以尝试使用@JsonRawValue
注释内容:
class Result {
@JsonRawValue
private String content;
}
这将输出:
[ {
"content" : { "key":["value1","value2","value3"]}
} ]
这在语义上是你想要的。但是,您希望outout格式相当。这可以通过指定序列化程序来实现,另请参阅Convert JSON String to Pretty Print JSON output using Jackson:
class Result {
@JsonRawValue
@JsonSerialize(using = ToPrettyJsonSerializer.class)
private String content;
}
private static class ToPrettyJsonSerializer extends JsonSerializer<String> {
@Override
public void serialize(String string, JsonGenerator gen, SerializerProvider provider) throws IOException, JsonProcessingException {
Object json = new ObjectMapper().readValue(string, Object.class);
gen.writeObject(json);
}
}
输出:
[ {
"content" : {
"key" : [ "value1", "value2", "value3" ]
}
} ]
这不是您期望的格式,而是接近。希望有所帮助。
答案 1 :(得分:0)
我认为,引号之前的反斜杠会导致问题,整个JSON数据被视为String而不是JSON对象。您可以尝试在将JSON转换为对象之前删除反斜杠。我找到的解决方案之一是:https://stackoverflow.com/a/19871960/1150795。
答案 2 :(得分:0)
尝试使用@JsonRawValue注释。