gpt4 book ai didi

java - 自定义 Jackson Deserializer 来处理任何 bean 的属性

转载 作者:行者123 更新时间:2023-11-30 08:13:27 24 4
gpt4 key购买 nike

我有一个名为 Channel 的类,它将具有如下 roles 属性

public class Channel{
private int id;
private String roles;
}

我来自客户端的 JSON 将是

{
"id":"12345787654323468",
"roles":[
{"name":"admin","permissions":["can publish","can reject"]},
{"name":"moderator","permissions":["can publish","can reject"]}
]
}

但是当我将此 JSON 转换为 Channel 对象时,出现以下异常

com.google.appengine.repackaged.org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.lang.String out of START_ARRAY token
at [Source: java.io.StringReader@6d25f91; line: 1, column: 253] (through reference chain: com.pokuri.entity.Channel["roles"])

现在我想将其作为字符串反序列化到 Channel 类的属性 roles 中。我还可以编写单个自定义反序列化器来处理任何 bean 中的 JSON 数组的属性。

最佳答案

自定义反序列化器可以解决这个问题。 :

class CustomDeserializer extends JsonDeserializer<String> {

@Override
public String deserialize(JsonParser jsonParser, DeserializationContext context) throws IOException, JsonProcessingException {

JsonNode node = jsonParser.readValueAsTree();
return node.toString();
}

}

现在要在你的 bean 中使用它,你必须将它包含在 roles 字段中:

class Channel {
private long id;

@JsonDeserialize(using = CustomDeserializer.class)
private String roles;



public long getId() {
return id;
}

public void setId(long id) {
this.id = id;
}

public String getRoles() {
return roles;
}

public void setRoles(String roles) {
this.roles = roles;
}

}

注意:我将 id 的值取为 long,因为它显示 int 的错误,如id 属性中的值太大。

现在 ObjectMapper 可以轻松地将您的 JSON 反序列化为 Channel 类:

String json = "{\"id\":\"12345787654323468\",\"roles\":[{\"name\":\"admin\",\"permissions\":[\"can publish\",\"can reject\"]},{\"name\":\"moderator\",\"permissions\":[\"can publish\",\"can reject\"]}]}";

ObjectMapper mapper = new ObjectMapper();
Channel channel = mapper.readValue(json, Channel.class);

System.out.println("Roles :"+channel.getRoles());

关于java - 自定义 Jackson Deserializer 来处理任何 bean 的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29960591/

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