Как десериализовать массив JSON в список? - PullRequest
0 голосов
/ 26 декабря 2018

Я пытаюсь использовать JSON, используя Джексона.

Класс, с которым я хочу связать свой json: -

KeyValueModel.class

public class KeyValueModel {

    private String k1;
    private String k2;
    public String getK1() {
        return k1;
    }
    public void setK1(String k1) {
        this.k1 = k1;
    }
    public String getK2() {
        return k2;
    }
    public void setK2(String k2) {
        this.k2 = k2;
    }
}

Я хочу сопоставить json напрямуюмой список моей модели, т. е. KeyValueModel

    @Test
    public void whenParsingJsonStringIntoList_thenCorrect() throws IOException {


    String jsonList = "{
  "count": 30,
  "data": [
    {
      "k1": "v1",
      "k2": "v2"
    },
    {
      "k1": "no",
      "k2": "yes"
    }
  ]
}";

ObjectMapper mapper = new ObjectMapper();
        JavaType listType = mapper.getTypeFactory().constructCollectionType(List.class, KeyValueModel.class);

        List<KeyValueModel> l = mapper.readValue(jsonList, listType);

        System.out.println(l.get(1).getK2());

        assertNotNull(l);


}

Я получаю ошибку, которая говорит

com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.util.ArrayList` out of START_OBJECT token
 at [Source: (String)"{
  "count": 30,
  "data": [
    {
      "k1": "v1",
      "k2": "v2"
    },
    {
      "k1": "no",
      "k2": "yes"
    }
  ]
}"; 

как я могу десериализовать массив данных в список?

Ответы [ 3 ]

0 голосов
/ 26 декабря 2018

Если вы используете библиотеку GSON, это должно работать:

  Type type = new TypeToken<List<KeyValueModel>>(){}.getType();
  List<KeyValueModel> l = new Gson().fromJson(jsonList,type);
0 голосов
/ 26 декабря 2018

Вам нужно создать еще один класс, потому что у вас есть еще одно свойство в строке json

public class Test{

    private String count;
    private KeyValueModel[] kv;

}

, затем измените код на

Test test = mapper.readValue(jsonList, Test.class);
System.out.println(test.getKv()[0].getK1()) will get the expected result
0 голосов
/ 26 декабря 2018

Посмотрите на ваши данные json, это объект, но вы пытаетесь разобрать его как список, список, который вы ищете в строке json, хранится в поле data , поэтому попробуйте что-нибудьвот так.

JSONObject json = new JSONObject(your_json_string);
JSONArray array = json.getJSONArray("data");

Теперь вы можете легко получить желаемый список объектов, передав array.toString () мапперу объектов

Спасибо

...