【问题标题】:Converting java object having string json filed in to JSON将具有字符串 json 的 java 对象转换为 JSON
【发布时间】:2015-10-07 23:36:41
【问题描述】:

在我们的应用程序中,一个数据库表有一些结果存储为 json,如下所示:

---------------------------------------------------- -------------
content                                             | other fields...
---------------------------------------------------- --------------
"{ \"key\":[\"value1\",\"value2\",\"value3\"]}"     | 12 ...

我需要获取并写入结果文件,一组记录的content 字段作为单个 json,例如: (预期)

[
  {
    "content": {
      "key": [
        "value1",
        "value2",
        "value3"
      ]
    }
  }
  .....
]

在对应的 java 实体中,我为除 content 之外的所有字段添加了 @JsonIgnore

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 字段作为字符串并作为键“内容”的值,而不是预期的嵌套 jason

【问题讨论】:

  • 输出正确 - 您的期望可能不正确。如果你想要 JSON 表示内容,那么,你需要编写自定义序列化器
  • 谢谢,这里我的问题与表示无关。@JsonRawValue 为我工作

标签: java json jackson


【解决方案1】:

我认为,引号前的反斜杠会导致问题,并且整个 JSON 数据被视为字符串而不是 JSON 对象。您可以在将 JSON 转换为对象之前尝试删除反斜杠。我找到的解决方案之一是:https://stackoverflow.com/a/19871960/1150795

【讨论】:

    【解决方案2】:

    尝试使用@JsonRawValue 注解。

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

    【讨论】:

      【解决方案3】:

      根据How can I include raw JSON in an object using Jackson?可以尝试用@JsonRawValue注释内容:

      class Result {
          @JsonRawValue
          private String content;
      }
      

      这将输出:

      [ {
        "content" : { "key":["value1","value2","value3"]}
      } ]
      

      这在语义上是你想要的。但是,您希望输出的格式非常好。这可以通过指定序列化程序来实现,另见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" ]
        }
      } ]
      

      这与您期望的格式不完全一样,但正在接近。希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-18
        • 2011-08-30
        • 1970-01-01
        • 2019-08-27
        • 2020-05-27
        • 1970-01-01
        • 1970-01-01
        • 2017-03-24
        相关资源
        最近更新 更多