Анализ строки JSON в Java

1

Я передаю строку методу, и мне нужно десериализовать его в объект, но я продолжаю работать в исключении JSON Mapping.

private static final ObjectMapper mapper = new ObjectMapper();

public ArrayList<Double> parseVector(String json){
    Vector vector = new Vector();
    try {
        vector = mapper.readValue(json, TypeFactory.collectionType(ArrayList.class, Vector.class));
    } catch ETC ........ 

Следует также отметить, что Vector является внутренним классом и устанавливается следующим образом:

static class Vector{
    @JsonProperty("P")
    public Double performance;
    @JsonProperty("M")
    public Double margin;
    @JsonProperty("I")
    public Double pace;
}

для этого примера значение json:

{'P':8,'M':2,'I':0} 

Я получаю это исключение:

JSONDeserializer : getVectorMap()   JsonMappingException : 
org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.util.ArrayList out of START_OBJECT token
 at [Source: java.io.StringReader@77d65595; line: 1, column: 1]

Может ли кто-нибудь дать мне некоторое представление об этом?

  • 0
    Вы можете просто сделать это static ?
  • 0
    Я сделал внутренний класс просто статическим и обновил оба блока кода выше ... а также добавил новую трассировку стека.
Показать ещё 1 комментарий
Теги:
arraylist
parsing

2 ответа

0
Лучший ответ

Ваша новая ошибка исходит из того, что

vector = mapper.readValue(json, TypeFactory.collectionType(ArrayList.class, Vector.class));

говорит Джексону десериализовать ArrayList<Vector> из json. Ваше значение json содержит объект JSON. Тип List можно десериализовать только из массива JSON.

Просто используйте

vector = mapper.readValue(json, Vector.class);
0

Джексон не может десериализовать нестатические внутренние классы. Это ограничение существует, потому что не существует общего способа создания экземпляров таких классов, поскольку для внутреннего класса не существует конструктора по умолчанию. Однако сериализация работает отлично.

Этот пост содержит более подробные аргументы:

Обратите внимание, что внутренний класс может обращаться ко всем переменным-членам внешнего класса. Когда мы напишем следующий код

public class Outer {

    // non-static
    class Inner {

    }
}

компилятор генерирует нечто похожее на

public class Outer { ... }

class Outer$Inner {
    private final Outer parent;

    Outer$Inner(Outer p) {
        parent = p;
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню