使用RestTemplate转换含嵌套字符串型JSON的JSON数据为Java POJO的报错及解决方法
解决Jackson解析嵌套字符串JSON到POJO的问题
我刚碰到过完全一样的场景,分享下我的问题分析和解决办法:
问题背景
我有一段JSON字符串,其中other_part字段是字符串形式的嵌套JSON(被引号包裹的宽松格式):
{"name": "abc", "type": "type1", "artist": {"name": "ally"}, "other_part": "{\"id\":\"ee50abd7\",\"metadata\":\"...\"}"}
我定义了对应的POJO类来接收这个JSON:
class Data { private String name; private String type; private Artist artist; private Other other_part; // 省略getters/setters } class Artist { private String name; // 省略getters/setters } class Other { private String id; private String metadata; // 省略getters/setters }
用RestTemplate转换时:
restTemplate.exchange(requestEntity, Data.class);
抛出了如下错误:
(although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value...
错误原因
RestTemplate默认使用Jackson做序列化/反序列化,Jackson看到other_part是String类型,但我的POJO里定义的是Other对象,而Other类没有提供接收String参数的构造方法或工厂方法,所以无法自动完成字符串到对象的转换,直接抛出了反序列化异常。
解决方案:自定义JsonDeserialize转换器
我通过自定义Jackson的JsonDeserialize转换器解决了这个问题,具体实现如下:
首先写一个字符串转Other对象的转换器:
public static class OtherConverter extends StdConverter<String, Other> { @Override public Other convert(String value) { // 这里用Gson来解析嵌套的字符串JSON,你也可以用Jackson的ObjectMapper return new Gson().fromJson(value, Other.class); } }
然后在Data类的other_part字段上添加@JsonDeserialize注解,指定我们的转换器:
class Data { private String name; private String type; private Artist artist; @JsonDeserialize(converter = OtherConverter.class) private Other other_part; // 省略getters/setters }
这样Jackson在解析other_part字段时,就会先调用我们的转换器,把字符串形式的JSON转成Other对象,完美解决了这个问题。
内容的提问来源于stack exchange,提问作者Sha
相关产品推荐
相关产品推荐

