ObjectMapper 将字符串值(json 格式)转换为对象
ObjectMapper convert string value(json format) to object
我的 api 回复是这样的
{
"name": "jackson",
"age": 33,
"hobby_list": "[{\"name\":\"soccer\", \"priority\":2}, {\"name\":\"game\", \"priority\":1}, {\"name\":\"reading\", \"priority\":3}]"
}
我想将 hobby_list
字符串值反序列化为对象。
class Person {
@JsonProperty("name")
private String name;
@JsonProperty("age")
private Integer age;
@JsonProperty("hobby_list")
private List<Hobby> hobbyList;
}
class Hobby(
@JsonProperty("name")
private String name;
@JsonProperty("priority")
private Integer priority;
)
如您所知,它不起作用。
Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.ArrayList<com.joont.domain.Hobby>` out of VALUE_STRING token
解决问题的最佳做法是什么?
注解?配置?自定义解串器?
您可以通过注册自定义解串器来转换它们,如下所示:
public class PersonDeserializer extends JsonDeserializer<Person> {
@Override
public Person deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
ObjectCodec oc = jp.getCodec();
JsonNode node = oc.readTree(jp);
final Integer age = node.get("age").asInt();
final String name = node.get("name").asText();
final String hobbyListAsString = node.get("hobby_list").asText();
ObjectMapper mapper = new ObjectMapper();
// convert JSON array to List of objects
List<Hobby> hobbyList = Arrays.asList(mapper.readValue(hobbyListAsString, Hobby[].class));
Person person = new Person();
person.setName(name);
person.setAge(age);
person.setHobbyList(hobbyList);
return person;
}
}
并且在 root 的 pojo 中使用注释 @JsonDeserialize(using = PersonDeserializer.class)
以便可以注册上述反序列化器。在下面附上参考资料:
@JsonDeserialize(using = PersonDeserializer.class)
@Data
public class Person {
@JsonProperty("name")
private String name;
@JsonProperty("age")
private Integer age;
@JsonProperty("hobby_list")
private List<Hobby> hobbyList;
}
然后我可以将上面的 hobby_list 字符串反序列化为对象
ObjectMapper mapper = new ObjectMapper();
Person person = mapper.readValue(content, Person.class);
System.out.println(person.getHobbyList());
我的 api 回复是这样的
{
"name": "jackson",
"age": 33,
"hobby_list": "[{\"name\":\"soccer\", \"priority\":2}, {\"name\":\"game\", \"priority\":1}, {\"name\":\"reading\", \"priority\":3}]"
}
我想将 hobby_list
字符串值反序列化为对象。
class Person {
@JsonProperty("name")
private String name;
@JsonProperty("age")
private Integer age;
@JsonProperty("hobby_list")
private List<Hobby> hobbyList;
}
class Hobby(
@JsonProperty("name")
private String name;
@JsonProperty("priority")
private Integer priority;
)
如您所知,它不起作用。
Caused by: com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.ArrayList<com.joont.domain.Hobby>` out of VALUE_STRING token
解决问题的最佳做法是什么?
注解?配置?自定义解串器?
您可以通过注册自定义解串器来转换它们,如下所示:
public class PersonDeserializer extends JsonDeserializer<Person> {
@Override
public Person deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException {
ObjectCodec oc = jp.getCodec();
JsonNode node = oc.readTree(jp);
final Integer age = node.get("age").asInt();
final String name = node.get("name").asText();
final String hobbyListAsString = node.get("hobby_list").asText();
ObjectMapper mapper = new ObjectMapper();
// convert JSON array to List of objects
List<Hobby> hobbyList = Arrays.asList(mapper.readValue(hobbyListAsString, Hobby[].class));
Person person = new Person();
person.setName(name);
person.setAge(age);
person.setHobbyList(hobbyList);
return person;
}
}
并且在 root 的 pojo 中使用注释 @JsonDeserialize(using = PersonDeserializer.class)
以便可以注册上述反序列化器。在下面附上参考资料:
@JsonDeserialize(using = PersonDeserializer.class)
@Data
public class Person {
@JsonProperty("name")
private String name;
@JsonProperty("age")
private Integer age;
@JsonProperty("hobby_list")
private List<Hobby> hobbyList;
}
然后我可以将上面的 hobby_list 字符串反序列化为对象
ObjectMapper mapper = new ObjectMapper();
Person person = mapper.readValue(content, Person.class);
System.out.println(person.getHobbyList());