我有一个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/