对 Jackson2 反序列化的更精细控制



我有这个类:

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注释相结合,以指示 de 对象映射器解决(没有双关语(反序列化为正确的嵌套对象。

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

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": 50n" + 
"}";
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))
}
}

最新更新