将具有字符串json的java对象转换为JSON

时间:2015-07-18 09:00:42

标签: java json jackson

在我们的应用程序中,一个数据库表将一些结果存储为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

3 个答案:

答案 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注释。

How can I include raw JSON in an object using Jackson?