gpt4 book ai didi

java - 使用 Jackson 反序列化具有内部列表的对象列表

转载 作者:行者123 更新时间:2023-11-30 08:39:16 36 4
gpt4 key购买 nike

我有这样一个实体:

public class User {

private Long id;
private String email;
private String password;
private List<Role> roles;

//set of constructors, getters, setters...

和相关的 JSON:

[
{
"email": "user@email",
"roles": ["REGISTERED_USER"]
}
]

我正在尝试以这种方式在 Spring MVC @Controller 中反序列化它:

List<User> users = Arrays.asList(objectMapper.readValue(multipartFile.getBytes(), User[].class));

添加前List<Role>它工作完美,但在我仍然没有运气之后。看来我需要一些自定义反序列化器,你能帮忙提供解决方法吗?谢谢!

最佳答案

如果您有权访问 Role 类,您只需添加这样的构造函数:

private Role(String role) {
this.role = role;
}

或静态工厂方法:

@JsonCreator
public static Role fromJson(String value){
Role role = new Role();
role.setRole(value);
return role;
}

@JsonValue
public String toJson() {
return role;
}

否则,您将不得不编写自定义反序列化器并将其注册到对象映射器上,如下所示:

public static class RoleSerializer extends JsonSerializer {
@Override
public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException, JsonProcessingException {
gen.writeString(((Role) value).getRole());
}
}

public static class RoleDeserializer extends JsonDeserializer {
@Override
public Role deserialize(JsonParser jsonParser,DeserializationContext deserializationContext) throws IOException {
ObjectCodec oc = jsonParser.getCodec();
JsonNode node = oc.readTree(jsonParser);
Role role = new Role();
role.setRole(node.asText());
return role;
}
}

这是演示:https://gist.github.com/varren/84ce830d07932b6a9c18

FROM: [{"email": "user@email","roles": ["REGISTERED_USER"]}]

TO OBJ: [User{id=null, email='user@email', password='null', roles=Role{role='REGISTERED_USER'}}]

TO JSON:[{"email":"user@email","roles":["REGISTERED_USER"]}]

请注意:如果你像这样使用 ObjectMapper

Arrays.asList(objectMapper.readValue(multipartFile.getBytes(), User[].class));

然后演示中的代码将起作用,但您可能必须在 Spring 中为 jackson ObjectMapper 设置自定义 Bean,以使 RoleDeserializer 和 RoleSerializer 在任何地方都起作用。这是更多信息: Spring, Jackson and Customization (e.g. CustomDeserializer)

关于java - 使用 Jackson 反序列化具有内部列表的对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36246209/

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