自定义 Jackson 反序列化器来处理任何 bean 的 属性
Custom Jackson Deserializer to handle a property of any bean
我有一个名为 Channel
的 class 它将有 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"])
现在我想将其作为字符串反序列化为 属性 roles
of Channel
class。我还可以编写单个自定义反序列化器来处理任何 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 class :
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());
我有一个名为 Channel
的 class 它将有 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"])
现在我想将其作为字符串反序列化为 属性 roles
of Channel
class。我还可以编写单个自定义反序列化器来处理任何 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 class :
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());