Тип объекта остается как LinkedHashMap после назначения - PullRequest
1 голос
/ 09 апреля 2020

У меня есть следующие JSON данные, извлекаемые из внешнего источника файла.

{
    .... More complicated structures within this JSON format above but I only care about the following
    "feature": {
        "100": {
            "DATA1": [
                {
                    "header": "head1",
                    "someId": "123"
                }
            ]
        }
    }
}

Я пытаюсь захватить следующую часть как List

"DATA1": [
    {
        "header": "head1",
        "someId": "123"
    }
]

но не в состоянии это сделать. Получение следующей ошибки:

Невозможно привести LinkedHashMap к списку.

Метод, который извлекает данные и пытается присвоить их списку

private void getData(){
    AllDataFromFile all = someFetchAPI(); // Got every JSON data in the file. 

    // capturing the portion that I want which I do get. 
    Map<String, Map<String,Object>> feature = all.getFeature(); 
    Map<String, Object> allData = feature.get("100");
    List<Data> dataList = allData.get("DATA1");
}

Нет ошибок компиляции и времени выполнения сверху, но dataList не является списком данных.

Вместо этого это список LinkedHashMap, когда я вижу в режиме отладки. Почему? И как я могу превратить это в Список данных вместо этого?

Поскольку он не отображается в виде списка <Данные>, я не могу выполнить такие операции, как указано ниже.

dataList.get(0).getHeader(). 

Невозможно привести его в действие и получить ту же ошибку:

Невозможно привести LinkedHashMap к списку.

Пожалуйста, советуйте. Спасибо.

Класс AllDataFromFile

@Getter
@Setter
@JsonInclude(Include.NON_NULL)
public class AllDataFromFile {
    private Map<String, Map<String,Object>> feature;
}

Класс данных

@JsonInclude(Include.NON_NULL)
public class Data implements Comparable<Data>, Cloneable{   
    private String header;
    private String someId;

    @Override
    public int compareTo(Data o) {
        int result = // some logic
        return result;
    }   
}

РЕДАКТИРОВАТЬ:

Это формат данных внутри списка

result = {ArrayList@18590} size = 1
  0 = {LinkedHashMap@18593} size = 2
    "header" -> "header1"
    "someId" -> "id1"

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

private Map<String, Map<String, List<Data>>> feature;

Способен go вернуться к получению LinkedHashMap (бесполезно, вернуться к квадратной единице), если I go для следующего:

private Map<String, Map<String, List>> feature;

Ошибка:

Не удалось прочитать JSON: класс java .util.LinkedHashMap не является подтипом [простой тип, класс com.aaaaaData] (через цепочку ссылок: com.bbbbbbAllDataFromFile ["feature"] -> java .util.LinkedHashMap ["100"] -> java .util.LinkedHashMap ["DATA1"] -> java .util.ArrayList [0])

1 Ответ

1 голос
/ 09 апреля 2020

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

Но, начиная с AllDataFromFile, он не может определить, что контент на самом деле является списком объектов данных, поэтому он возвращается к спискам по умолчанию (ArrayList ) и Карты (LinkedHashMap).

Я думаю, если вы предоставите больше информации в объявлении типа, Джексон может выяснить это:

public class AllDataFromFile {
    private Map<String, Map<String, List<Data>>> feature;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...