gpt4 book ai didi

java - 对 jackson2 反序列化的更好控制

转载 作者:行者123 更新时间:2023-12-02 09:37:05 25 4
gpt4 key购买 nike

我有这门课:

class Address {
int id;
String address;
// ... other fields
}

我还有许多其他嵌入 Address 的类,一个例子:

class Person {
int id;
String name;
Address address;
// ... other fields
}

我收到一个代表一个人的 json,例如:

{
"id": 10,
"name": "John",
"addressId": 50,
// ... other fields
}

我可以将上面的内容反序列化为

class PersonJson {
int id;
String name;
int addressId;
// ... other fields
}

然后转换PersonJson进入Person .

但是,这可能发生在层次结构的更深处。我有Organization有一个 List<Person> ,所以我需要 OrganizationJsonList<PersonJson>然后我需要转换为 OrganizationList<Person> .

或者,我可以为Person制作一个自定义解串器。 ,但自从 Address嵌入在许多其他对象中,我必须为每个对象制作一个反序列化器。我认为我不能重用其中的大部分内容,并且大多数其他字段将默认由 ObjectMapper 反序列化(即原语等)。 .

两者都是可行的,但都是工作的重复 ObjectMapper已经存在并且需要在多个地方进行维护,这是一种痛苦。有没有办法配置ObjectMapper自定义反序列化字段(包括在集合中,例如 List<Address> )或其他避免重复的方法?

最佳答案

我的第一个尝试是将 @JsonProperty 结合起来与 @JsonCreator注释来指示对象映射器解决(没有双关语)反序列化到正确的嵌套对象的问题。

为了简单起见,并通过评论了解您的不可变性,下面有一个使用 lombok 的示例。

import java.io.IOException;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonPOJOBuilder;

import lombok.Builder;
import lombok.Data;
import lombok.Getter;
import lombok.NonNull;
import lombok.ToString;

public class JsonTest {

@Data
@Builder(toBuilder = true)
@ToString
@Getter
static class Address {
int id;
@NonNull
String address;

@JsonCreator
public static Address factory(int id) {
return new AddressBuilder().id(id).address("getAddressLogicHere").build();
}
}

@Data
@JsonDeserialize(builder = Person.PersonBuilder.class)
@Builder(toBuilder = true)
@ToString
@Getter
static class Person {
private final int id;
@NonNull
private final String name;
@JsonProperty("addressId")
private final Address address;

@JsonPOJOBuilder(withPrefix = "")
public static class PersonBuilder {
}
}

public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException {
String json = "{\n" +
" \"id\": 10,\n" +
" \"name\": \"John\",\n" +
" \"addressId\": 50\n" +
"}";
Person person = new ObjectMapper().readValue(json, Person.class);
System.out.println(person);
//JsonTest.Person(id=10, name=John, address=JsonTest.Address(id=50, address=getAddressLogicHere))
}

}

关于java - 对 jackson2 反序列化的更好控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57417313/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com