Не удается создать экземпляр значения типа java.util.LinkedHashMap из значения String ('{'); нет однострочного конструктора/фабричного метода

У меня есть следующие 2 класса:

@JsonIgnoreProperties(ignoreUnknown = true)
public class ChangesJSON {

    @JsonProperty("changes")
    List<ChangeJSON> changes;

    @JsonProperty("more")
    Boolean more;
}

public class ChangeJSON {

    @JsonProperty("epoch")
    Long epoch;

    @JsonProperty("payload")
    Map<String, Object> payload;
}

Когда я пытаюсь десериализовать этот тест:

String test = "{\"changes\":[{\"epoch\":1441556306522,\"payload\":\"{\"to\":1}\"},{\"epoch\":1441555481524,\"payload\":\"{\"to\":-1}\"}],\"more\":false}";

@Test
public void myTest() {
    ObjectMapper mapper = new ObjectMapper();
    ChangesJSON result = null;
    try {
        result = mapper.readValue(test, ChangesJSON.class);
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    assertNotNull(result);
}

Я получаю следующее исключение:

com.fasterxml.jackson.databind.JsonMappingException: невозможно создать экземпляр значения типа java.util.LinkedHashMap из значения String ('{'); нет однострочного конструктора/фабричного метода в [Источник: {"changes":[{"epoch":1441556306522,"payload":"{"to":1}"},{"epoch":1441555481524,"payload" :"{"to":-1}"}],"more":false}; строка: 1, столбец: 35] (через цепочку ссылок: demo.ChangesJSON["changes"]->java.util.ArrayList[0]->demo.ChangeJSON["payload"])

Кажется, есть проблема с картой, но я подумал, что Джексон должен уметь работать с картами. У меня возникает такая же проблема, когда я меняю карту на карту. Но мне нужно поддерживать всевозможные классы в качестве значений карты.


person checklist    schedule 07.09.2015    source источник
comment
Ваш JSON недействителен. Если вы удалите экранирующую обратную косую черту, она будет содержать "payload": "{"to":1}"} вместо "payload": {"to":1}}   -  person JB Nizet    schedule 07.09.2015


Ответы (2)


У вас есть кавычки вокруг объекта payload. Попробуйте изменить эту часть:

\"payload\":\"{\"to\":1}\"

в это:

\"payload\":{\"to\":1}
person Petter    schedule 07.09.2015

Я думаю, что проблема в самом JSON. Он убегает к:

{"changes":[{"epoch":1441556306522,"payload":"{"to":1}"},{"epoch":1441555481524,"payload":"{"to":-1}"}],"more":false}

Вероятно, это должно быть что-то вроде:

{"changes":[{"epoch":1441556306522,"payload":{"to":1}},{"epoch":1441555481524,"payload":{"to":-1}}],"more":false}

So:

String test = "{\"changes\":[{\"epoch\":1441556306522,\"payload\":{\"to\":1}},{\"epoch\":1441555481524,\"payload\":{\"to\":-1}}],\"more\":false}";
person mprivat    schedule 07.09.2015