如何修改spring/jackson JSON反序列化

如何修改spring/jackson JSON反序列化,json,spring,jackson,type-conversion,Json,Spring,Jackson,Type Conversion,我试图找出如何调整spring/jackson将JSON字符串(存储在文件中)转换为各种POJO的方式。例如,如果我有这个JSON: { "rates":{ "EURUSD":5.4321, "USDHKD":1.2345 } } 我实际上想得到我的“Rates”类的一个实例。在里面,我想要一个包含每个单独费率的列表 在我的spring配置文件中,我创建了以下条目: @Bean public ObjectMapper jsonObjec

我试图找出如何调整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的转换服务,目的是定义一个将映射映射到列表的转换器。i、 e.此签名:
转换器
。然而,这是基于这样的假设:在调用转换服务之前,JSON首先被转换为标准类型。我现在认为一个假设是不正确的

因此,我现在试图弄清楚是否需要注册某种自定义ObjectMapper来处理直接从JSON字符串数据读取的操作。但这听起来像是过度杀戮,因为我只想调整对象图的一部分,让默认转换器处理其余部分


欢迎指点。谢谢

好的,Jackson试图避开结构转换(因为这是一个快速的沙坑,具有无限数量的常规排列)。但是可以使用一些现有的特性来做您想要做的事情

第一:要使用对象键来指示类型,您可能需要启用包含“作为对象包装器”的多态类型处理。 因此,添加如下内容:

@JsonTypeInfo(as=Include.WRAPPER_OBJECT)
@JsonAnySetter
public void set(String key, Double value) // or "Object value")
{
    list.add(new Rate(key, value));
}
对于您的
费率
类声明

关于将值转换为列表;这可以通过定义“任意setter”(请参阅)来实现,例如:

@JsonTypeInfo(as=Include.WRAPPER_OBJECT)
@JsonAnySetter
public void set(String key, Double value) // or "Object value")
{
    list.add(new Rate(key, value));
}
我希望这有帮助