我有这个类:
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>
,所以我需要有OrganizationJson
和List<PersonJson>
,然后我需要转换为Organization
和List<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))
}
}