【问题标题】:How to modify spring/jackson JSON deserialisation如何修改 spring/jackson JSON 反序列化
【发布时间】:2015-03-19 10:35:35
【问题描述】:

我试图弄清楚如何调整 spring/jackson 将 JSON 字符串(存储在文件中)转换为各种 POJO 的方式。例如,如果我有这个 JSON:

{
    "rates":{
        "EURUSD":5.4321,
        "USDHKD":1.2345
    }
}

我实际上想获得我的“Rates”类的一个实例。在里面我想要一个包含每个单独费率的列表。

在我的 spring 配置文件中,我创建了这个条目:

@Bean 
    public ObjectMapper jsonObjectMapper() {
        return new MappingJackson2HttpMessageConverter().getObjectMapper();
}

在我的服务课上,我这样做了:

@Autowired
ObjectMapper jsonObjectMapper;

public Rates currentRates() {
    Resource resource = this.ctx.getResource("classpath:stub/data/rates/Rates-01.json");
    return this.jsonObjectMapper.readValue(resource.getURL(), Rates.class);
}

问题是我试图弄清楚如何将包含货币的地图作为一个键,将这些货币分成两部分,然后创建一个包含两种货币和汇率的 RateEntry 对象,然后再填充列表Rates 类。

我一直在研究 Spring 的转换服务,其想法是定义一个将 Map 映射到列表的转换器。即这个签名:Converter<Map<String, BigDecimal>, List<Rate>>。然而,这是基于在调用转换服务之前首先将 JSON 转换为标准类型的假设。我现在认为的一个假设是不正确的。

所以我现在想弄清楚是否需要注册某种自定义 ObjectMapper 来处理直接从 JSON 字符串数据读取。但这听起来有点过头了,因为我只想调整部分对象图,让默认转换器处理其余部分。

任何指针表示赞赏。谢谢。

【问题讨论】:

    标签: json spring jackson type-conversion


    【解决方案1】:

    好的,Jackson 试图远离结构转换(因为它是一个流沙坑,具有无限数量的一般排列)。但也许可以使用一些现有的功能来做你想做的事。

    首先:要使用 Object 键来指示类型,您可能希望启用包含“作为对象包装器”的多态类型处理。 所以添加如下内容:

    @JsonTypeInfo(as=Include.WRAPPER_OBJECT)
    

    为您的Rates 类声明。

    关于将值转换为列表;这可以通过定义“any-setter”(参见http://www.cowtowncoder.com/blog/archives/2011/07/entry_458.html)来实现,例如:

    @JsonAnySetter
    public void set(String key, Double value) // or "Object value")
    {
        list.add(new Rate(key, value));
    }
    

    我希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 2014-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-28
      • 1970-01-01
      相关资源
      最近更新 更多