2013-12-02 5 views
0

У меня есть проблема с использованием библиотеки Jackson, чтобы десериализовать строку JSON и отобразить ее в POJO.Исключение Jackson JSON при десериализации

У меня есть этот JSON:

[{ 
    "requestor": "Nick Jagger", 
    "smtp": "[email protected]", 
    "smtp_from": "[email protected]", 
    "cnname": "testcn", 
    "date": "2014-11-11", 
    "system_ciid": "3926598", 
    "request_base64": "its some base64 hash" 
}, { 
    "requestor": "Freddie Mercury", 
    "smtp": "[email protected]", 
    "smtp_from": "[email protected]", 
    "cnname": "testowe cn", 
    "date": "2014-11-26", 
    "system_ciid": "JK19", 
    "request_base64": "some base64 hash" 
}] 

Я создал класс POJO для представления одного элемента в этом массиве:

public class Questionareimplements Serializable { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = 1L; 
    @JsonProperty("cnname") 
    private String caName; 
    @JsonProperty("smtp") 
    private String smtp; 
    @JsonProperty("requestor") 
    private String issuer; 
    @JsonProperty("system_ciid") 
    private String system_ciid; 
    @JsonProperty("date") 
    private String date; 
    @JsonProperty("request_base64") 
    private String base64String; 
    @JsonProperty("smtp_from") 
    private String smtp2; 


    // getters and setters 
} 

А класс, который представляет список этих объектов:

public class QuestionareList { 

    private List<Questionare> questionares; 

    public List<Questionare> getQuestionares() { 
     return questionares; 
    } 

    public void setQuestionares(List<Questionare> questionares) { 
     this.questionares = questionares; 
    } 
} 

А теперь, как я сопоставляю эти

QuestionareList listQ = new QuestionareList(); 

ObjectMapper m = new ObjectMapper(); 

listQ = m.readValue(jsonString,QuestionareList.class); 

Все, что я получаю:

Can not deserialize instance of com.test.service.QuestionareList out of START_ARRAY token 
at [Source: [email protected]; line: 1, column: 1] 

Любая идея, что я делаю неправильно?

ответ

2

Я рассматриваю, что у вас уже есть 2 банки, т.е. 1. Джексон Ядро 2. Джексон Mapper

Так что для разбора из JSON в вашем POJO

ObjectMapper mapper = new ObjectMapper(); 
JavaType javaType=mapper.getTypeFactory().constructCollectionType(List.class,Questionare.class); 

QuestionareList listQ = new QuestionareList(); 
listQ.setQuestionares(mapper.readValue(jsonString,javaType)); 

Или, если мы можем сделать это на вашем пути

ObjectMapper mapper = new ObjectMapper(); 
    JavaType javaType=mapper.getTypeFactory().constructType(QuestionareList.class); 

    QuestionareList listQ = new QuestionareList(); 
    listQ = mapper.readValue(jsonString,javaType); 

и вот оно!.

+0

Хорошее объяснение! –

0

QuestionareList requirs json object, который имеет поле массива, но вы json string - это просто массив. Вы можете использовать следующее для десериализации массива в список Список questionares = m.readValue (jsonString, new TypeReference>() {});

+0

Благодарим вас за anwser, но с помощью 'listQ = m.readValue (jsonString, new TypeReference () {});' вместо 'listQ = m.readValue (jsonString, QuestionareList.class); , Я все еще получаю одно и то же исключение :( – Mithrand1r

+0

Я пробовал со следующим, он отлично подходит для меня. ObjectMapper m = new ObjectMapper(); Список questionares = m.readValue ("[{\" cnname \ ": \" testcn \ "}, {\" cnname \ ": \" testowe cn \ "}]", новый TypeReference <Список >() {}); –

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