2015-01-21 7 views
0

Я пытаюсь выяснить, как настроить способ, которым Spring/Jackson преобразует строку JSON (хранящуюся в файле) в различные POJO. Например, если у меня есть этот JSON:Как изменить Spring/jackson JSON deserialisation

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

Я на самом деле хочу, чтобы получить экземпляр моего класса "ставки. Внутри я хочу Список, содержащий каждую индивидуальную ставку.

В моем файле весна конфигурации Я создал эту запись:

@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, содержащий две валюты и ставку, перед заполнением списка в классе «Тариф».

Я искал службу преобразования Spring с идеей определения конвертера, который отображает карту в список. т.е. эта подпись: Converter<Map<String, BigDecimal>, List<Rate>>. Однако это основано на предположении, что JSON сначала преобразуется в стандартные типы до вызова службы преобразования. Предположение, которое я сейчас считаю неправильным.

Так что теперь я пытаюсь выяснить, нужно ли мне регистрировать какой-то пользовательский ObjectMapper, чтобы обрабатывать чтение непосредственно из данных JSON String. Но это звучит как «убить», так как я хочу только отрегулировать часть графа объектов и позволить конвертерам по умолчанию обрабатывать остальные.

Любые указатели оценили. Благодарю.

ответ

0

Хорошо, Джексон пытается держаться подальше от структурных преобразований (поскольку это быстропроходная яма с неограниченным количеством общих перестановок). Но может быть возможно использовать некоторые существующие функции, чтобы делать то, что вы хотите.

Первый: чтобы использовать ключ объекта для указания типа, вы, вероятно, захотите включить обработку полиморфного типа с включением «как обертка объекта». Так добавить что-то вроде:

@JsonTypeInfo(as=Include.WRAPPER_OBJECT) 

для Rates объявления класса.

Что касается преобразования значений в список; это может работать, определяя «любой-сеттер» (см 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)); 
} 

Я надеюсь, что это помогает.

Смежные вопросы