gpt4 book ai didi

java - Jackson 构建器模式从父级获取值(value)

转载 作者:行者123 更新时间:2023-12-05 07:31:19 24 4
gpt4 key购买 nike

我正在尝试使用 Jackson 从父节点获取值。

我知道这可以通过自定义反序列化器实现,但是样板太多了,因为您突然不得不手动处理所有事情。

这听起来很简单,但没有找到实现的方法。

为了说明我想要什么 - 如果我们有一个简单的 UserAddress...

@JsonDeserialize(builder = User.Builder.class)
public class User
{
private long id;
private String firstName;
private Address address;
...

public static class Builder
{
public Builder withId(long id);
public Builder withFirstName(String value);
public Builder withAddress(Address address);
public User create();
}
}

如果我们有相同的地址

@JsonDeserialize(builder = Address.Builder.class)
public class Address
{
...

public static class Builder
{
public Builder withUserId(long id); // is there a way to ask for the parent id here?
public Builder withStreetName(String value);
public Address create();
}
}

示例输入:

{
"id": 7,
"firstName" : "John",
"lastName" : "Smith",
"address" : {
"streetName": "1 str"
}
}

最佳答案

不,我认为您无法使用任何现有的 Jackson 代码。我认为唯一可以像这样跨越父/子关系的是类型序列化/反序列化和 UNWRAP_ROOT_VALUE 支持。

如果你想要这样的东西,你要么需要为 User 使用自定义反序列化器,要么自定义 User 构造函数以使用正确的地址构建新地址UserId 在将其添加到构建器的内部状态之前。这是一个示例(使用 Lombok 来处理构建器的样板生成):

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.Value;
import lombok.experimental.Wither;

public class Scratch {

public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
String json = "{\"id\":1234,\"address\":{\"street\":\"123 Main St.\"}}";

User user = mapper.readValue(json, User.class);

System.out.println(user.toString());

}


@Value
@JsonDeserialize(builder = User.UserBuilder.class)
public static class User {
private final int id;
private final Address address;


@Builder(toBuilder = true)
public User(int id, Address address) {
this.id = id;
// Build a new address with the user's ID
this.address = address.withUserId(id);
}

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


@Value
@Builder(toBuilder = true)
@JsonDeserialize(builder = Address.AddressBuilder.class)
public static class Address {

@Wither
private final int userId;

private final String street;

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

}

这会消耗以下 json:

{
"id": 1234,
"address": {
"street": "123 Main St."
}
}

并产生以下输出:

Scratch.User(id=1234, address=Scratch.Address(userId=1234, street=123 Main St.))

关于java - Jackson 构建器模式从父级获取值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51899280/

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