java - Jackson JSON 输出格式

标签 java json jackson

我有一个ArrayList<Person>其中包含一些 Person类型对象。 Person类具有以下属性及其 getter 和 setter:

private int id;
private String name;
private String email;
private LocalDate birthDate;

我想导出 ArrayList<Person>JSON具有完全相同格式的输出文件: persons.json :

[
  {
    "id": 1,
    "name": "The Best",
    "email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="097d616c676c717d6b606e7d6160676e496e64686065276a6664" rel="noreferrer noopener nofollow">[email protected]</a>",
    "birthDate": "1981-11-23"
  },
  {
    "id": 2,
    "name": "Andy Jr.",
    "email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="4732342607202a262e2b6924282a" rel="noreferrer noopener nofollow">[email protected]</a>",
    "birthDate": "1982-12-01"
  },
  {
    "id": 3,
    "name": "JohnDoe",
    "email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="83e4e2eee6ecf5e6f1c3e4eee2eaefade0ecee" rel="noreferrer noopener nofollow">[email protected]</a>",
    "birthDate": "1990-01-02"
  },
  {
    "id": 4,
    "name": "SomeOne",
    "email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="86f4f3e5edf5e7e5edc6e1ebe7efeaa8e5e9eb" rel="noreferrer noopener nofollow">[email protected]</a>",
    "birthDate": "1988-01-22"
  },
  {
    "id": 5,
    "name": "Mr. Mxyzptlk",
    "email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="8fede6e8e2eee1cfe7e0fbe2eee6e3a1ece0e2" rel="noreferrer noopener nofollow">[email protected]</a>",
    "birthDate": "1977-08-12"
  }
]

我尝试创建一个 Array来自ArrayList并从中创建输出 Array但我有一个无法解决的问题。我正在获取 birthDate 的输出数据属性如下所示:

"birthDate" : {
    "year" : 1952,
    "month" : "JANUARY",
    "chronology" : {
      "id" : "ISO",
      "calendarType" : "iso8601"
    },
    "era" : "CE",
    "leapYear" : true,
    "dayOfMonth" : 27,
    "monthValue" : 1,
    "dayOfWeek" : "SUNDAY",
    "dayOfYear" : 27
  }

如何使每个属性具有与示例 persons.json 中提供的相同的输出格式输出文件。除了核心、注释和数据绑定(bind)之外,我不允许使用任何其他 Jackson 库。我也不允许更改类内的属性类型。

最佳答案

所以如果不允许添加maven依赖

<dependency>
    <groupId>com.fasterxml.jackson.datatype</groupId>
    <artifactId>jackson-datatype-jsr310</artifactId>
    <version>2.4.0</version>
</dependency>

然后您可以为您的类编写自定义序列化程序,如下所示:

public class MyCustomSerializer extends JsonSerializer<Person> {

    @Override
    public void serialize(Person value, JsonGenerator jgen,
                          SerializerProvider provider) throws IOException,
            JsonProcessingException {
        if (value != null) {
            jgen.writeStartObject();

            jgen.writeStringField("date", DateTimeFormatter.ofPattern("yyyy-MM-dd").format(value.getBirthDate()));
            // parse other fields here manually

            jgen.writeEndObject();
        }
    }
}

并将以下注释添加到您的 Person.class 中:

@JsonSerialize(using = MyCustomSerializer.class)

它将日期解析为:

{
    "date": "2018-08-23"
}

如果您不想编写自定义序列化程序,另一种选择是使用 @JsonGetter 注释,但您应该将 @JsonIgnore 添加到birthDate 字段,或者为 @JsonGetter("sameAsFieldName") 提供相同名称的值。如果您为 @JsonGetter 提供另一个值并且不将 @JsonIgnore 添加到您的字段,它会序列化您的字段和 @JsonGetter 返回值。

您可以向您的类添加如下方法:

@JsonGetter("birthDate")
public String getSerializedLocalDate() {
    return DateTimeFormatter.ofPattern("yyyy-MM-dd").format(this.getBirthDate());
}

关于java - Jackson JSON 输出格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51993749/

相关文章:

java - 让 Jackson 对输入 JSON 更友好

java - 如何在 Java servlet 容器上指定 Http Request 超时参数

java - for循环中的除数值正在神秘地(?)改变

javascript - 是否可以将模板对象保存为 JSON 标准格式的 JSON 文件?

javascript - 从textarea到div的文本具有有限的宽度和高度

java - 使用 Jersey 和 Jackson 进行 JSON 格式化

java - 集合和 jax-rs

java - JSP内容显示在浏览器上

java - json 中的 Json 在 Spring Boot 中不起作用

android - 如何通过 Gson 解析包含 JSON 数组的 JSON 对象?