You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 13:52:34