2015-07-28 2 views
4

У меня есть объект Java Результаты:Джексон маршализацию пользовательского объекта вместо LinkedHashMap

public class MetaData { 
    private List<AttributeValue<String,Object>> properties 
    private String name 
    ... 

    ... getters/setters ... 
} 

AttributeValue класс представляет собой общий класс ключ-значение. Возможно, разные атрибуты AttributeValue вложены. Значение (значение) Объект будет другим атрибутом AttributeValue и так далее.

Из-за устаревшей причины структура этого объекта не может быть изменена.

У меня есть мой JSON, который я пытаюсь сопоставить с этим объектом. Все подходит для обычных объектов. Также первый уровень списка заполняется AttributeValues.

Проблема Объект. Джексон не знает, как интерпретировать это вложенное поведение и просто делает его LinkedHashMap.

Я ищу способ реализовать пользовательское поведение, чтобы сообщить Джексону, что это должен быть объект AttributeValue, а не LinkedHashMap.

Это, как я в настоящее время преобразования JSON:

ObjectMapper om = new ObjectMapper(); 
MetaData metaData = om.readValue(jsonString, new TypeReference<MetaData>(){}); 

И это пример JSON. (это получается путем сериализации существующего объекта MetaData для JSON, у меня есть полный контроль над этим синтаксисом).

{ 
    "properties":[ 
     { 
      "attribute":"creators", 
      "value":[ 
       { 
        "attribute":"creator", 
        "value":"user1" 
       },{ 
        "attribute":"creator", 
        "value":"user2" 
       } 
      ] 
     },{ 
      "attribute":"type", 
      "value": "question" 
     } 
    ], 
    "name":"example" 
} 

(кстати: Я пробовал то же самое с помощью GSON, но тогда объект является StringMap и проблема та же решения с использованием GSON также приветствуются.).

редактировать В Using Jackson ObjectMapper with Generics to POJO instead of LinkedHashMap есть комментарий от StaxMan: «LinkedHashMap возвращается только когда информация о типе отсутствует (или, если Object.class определяется как тип)

Последнее, кажется, здесь проблема. Могу ли я переопределить это?

+0

Вы проверили это: http://stackoverflow.com/questions/22358872/how-to-convert-linkedhashmap-to-custom-java-object –

+0

Спасибо. Да, я сделал это, но это не решение моей проблемы. Объект MetaData создается правильно, и есть список AttributeValues ​​(на первом уровне). Проблема находится на втором уровне, где _Object_ следует заменить другим (вложенным) AttributeValue. – user3319803

+0

В http: // stackoverflow.com/questions/8903863/using-jackson-objectmapper-with-generics-to-pojo-вместо-связанногоhashmap StaxMan говорит: «_LinkedHashMap возвращается только при отсутствии информации о типе * (или если Object.class определен как type) ** «Это похоже на причину, но я хочу переопределить это ... – user3319803

ответ

1

Если у вас есть контроль над сериализацией, попробуйте позвонить enableDefaultTyping() на свой картограф.

Рассмотрим следующий пример:

Pair<Integer, Pair<Integer, Integer>> pair = new Pair<>(1, new Pair<>(1, 1)); 
ObjectMapper mapper = new ObjectMapper(); 
String str = mapper.writeValueAsString(pair); 
Pair result = mapper.readValue(str, Pair.class); 

Без enableDefaultTyping(), я бы str = {"k":1,"v":{"k":1,"v":1}}, который бы десериализации к Pair с LinkedHashMap.

Но если я enableDefaultTyping() на mapper, то str = {"k":1,"v":["Pair",{"k":1,"v":1}]}, который затем отлично десериализуется до Pair<Integer, Pair<...>>.

+0

Спасибо @hotkey, я попробую это. Но если я это правильно пойму, это будет означать, что я должен написать свой Java-класс в свой JSON, который будет их связывать вместе друг с другом? – user3319803

+0

@ user3319803, да, включая информацию о типе в JSON, привязывает его к определенным классам. Но привязка настраивается: вы можете изменить типизацию Джексона, например, используя '@ JsonTypeInfo' в своем классе и изменяя типизацию картографа. Иногда это может помочь вам в десериализации динамических/общих типов, даже если у вас нет контроля над сериализацией, например. когда вы работаете с некоторыми API. – hotkey

+0

@ user3319803, кстати, вы можете просмотреть [эту статью] (http://wiki.fasterxml.com/JacksonPolymorphicDeserialization) в качестве введения, хотя речь идет о полиморфном десериализации. – hotkey

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