2014-10-08 3 views
0

мне нужно deserializa в JSon так:Джексон Полиморфные Десериализация ожидается START_ARRAY

{ 
    "arrayObj1":[ 
     { 
     "type":"t1", 
     "value":[ 
      { 
       "value1":"a" 
      }, 
      { 
       "value2":"b" 
      } 
     ], 
     "otherInfo":"abc" 
     } 
    ] 
} 

Thats, как я пытаюсь сделать это:

public class ClassA{ 
private ArrayObj1[] arrayObj1;} 

Тогда ...

и ...

public abstract class Value {} 

Это ошибка IV получил: com.fasterxml.jackson.databind.JsonMappingException: Неожиданный токен (START_OBJECT), ожидаемый START_ARRAY: необходимость JSON массива содержать информацию о типе As.WRAPPER_ARRAY для класса ... и т.д.

Как справиться с этим? Благодарю.

EDIT: Это, как я десериализации:

public ClassA getObj (String jsonString) { 
    ClassA obj = null; 
    try { 
     obj = new ObjectMapper().readValue(jsonString, ClassA.class); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return obj; 
} 

Полная ошибка:

com.fasterxml.jackson.databind.JsonMappingException: Неожиданный маркер (START_OBJECT), ожидаемый START_ARRAY: необходимость JSON Array содержит Информация типа типа As.WRAPPER_ARRAY для класса. Значение в [Источник: [email protected]; Линия: 1, колонка: 496] (через эталонной цепи:. .ClassA [ "arrayObj1"] -> ArrayObj1 [ "значение"])

+0

Какой код вы используете для собственно десериализации? И каково полное сообщение об ошибке? Эти вещи помогут отладить вашу проблему. –

+0

Привет, я не уверен в этом, но вот как я десериализую, я редактирую сообщение. – LinkOut

ответ

0

Учитывая структуру вы используете, вы на самом деле нужно еще один уровень классы, содержащие внешний идентификатор типа. Так что-то вроде этого:

public class ClassA { 
    private ValueWrapper[] arrayObj1; 
} 

public class ValueWrapper { 
    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, 
       include = JsonTypeInfo.As.EXTERNAL_PROPERTY, 
       property = "type") 
    @JsonSubTypes(value={ 
     @JsonSubTypes.Type(value = T1.class, name = "t1") 
    } 
    public Value value; 

    public String otherInfo; 

    // or use getters/setters in addition; left as fields for brevity 
} 

public abstract class Value { ... } 

)

Однако, глядя на ваш JSON более тесно, это на самом деле будет работать только тогда, когда ваши ценности были POJOs. Если предполагается, что тип для всех элементов массива value, автоматизированного способа сделать это не существует. Вам, к сожалению, придется обращаться с полиморфными типами вручную.

+0

Итак, если массив значений является массивом POJO, все из того же «типа», я не мог обработать его с помощью джексона? – LinkOut

+0

Хм ... я не понимаю Ваш ответ в любом случае ... – LinkOut

+1

Короткий ответ - нет, вы не можете использовать '@ JsonTypeInfo', как структурирован JSON. 'type' должен быть для каждого значения, а НЕ для массива. – StaxMan