Jackson, можно ли обработать динамический массив?

232
12 июля 2017, 23:27

Есть такой Json

 "color": {
            "id": "6",
            "name": "GMF",
            "images": {
                "1": {
                    "type": "main",
                    "title": "Replica A996 GMF",
                    "big": "http://shop.wheelshop.com.ua/photo/wheels/b/Replica-A996-GMF.png",
                    "average": "http://shop.wheelshop.com.ua/photo/wheels/a/Replica-A996-GMF.png",
                    "small": "http://shop.wheelshop.com.ua/photo/wheels/s/Replica-A996-GMF.png",
                    "micro": "http://shop.wheelshop.com.ua/photo/wheels/m/Replica-A996-GMF.png"
                },
                "5": {
                    "type": "live",
                    "title": "Replica A996 GMF",
                    "big": "http://shop.wheelshop.com.ua/photo/wheels_live/b/Replica-A996-GMF.png",
                    "average": "http://shop.wheelshop.com.ua/photo/wheels_live/a/Replica-A996-GMF.png",
                    "small": "http://shop.wheelshop.com.ua/photo/wheels_live/s/Replica-A996-GMF.png",
                    "micro": "http://shop.wheelshop.com.ua/photo/wheels_live/m/Replica-A996-GMF.png"
                }

В строке images есть динамические массивы 1, 5, тоисть в одном запросе это может только блок 1,а в другом запросе и вовсе блок 3. Но проблема в том, что карта Json в Jackson должна быть четко прописана,если что-то меняется, то не работает ничего. Есть ли вообще решение для такого случая?

Попробовал распарсить так

public class PjColorImages {
Map<String, PjColorImagesMain> properties_main;
@JsonAnyGetter
public Map<String, PjColorImagesMain> any() {
    return properties_main;
}
@JsonAnySetter
public void set(String name, PjColorImagesMain value) {
    properties_main.put(name, value);
}
@Override
public String toString() {
    return "PjColorImages{" +
            "properties_main=" + properties_main +
            '}';
}

Но выдает такой exception

com.fasterxml.jackson.databind.JsonMappingException: N/A (through reference chain: com.example.PjMain["data"]->java.util.ArrayList[0]->com.example.PjMainData["color"]->com.example.PjColor["images"]->com.example.PjColorImages["i1"])

Код класса PjColorImagesMain

public class PjColorImagesMain {
private String type,title,big,average,small,micro;
public String getType() {
    return type;
}
public void setType(String type) {
    this.type = type;
}
public String getTitle() {
    return title;
}
public void setTitle(String title) {
    this.title = title;
}
public String getBig() {
    return big;
}
public void setBig(String big) {
    this.big = big;
}
public String getAverage() {
    return average;
}
public void setAverage(String average) {
    this.average = average;
}
public String getSmall() {
    return small;
}
public void setSmall(String small) {
    this.small = small;
}
public String getMicro() {
    return micro;
}
public void setMicro(String micro) {
    this.micro = micro;
}
@Override
public String toString() {
    return "PjColorImagesMain{" +
            "type='" + type + '\'' +
            ", title='" + title + '\'' +
            ", big='" + big + '\'' +
            ", average='" + average + '\'' +
            ", small='" + small + '\'' +
            ", micro='" + micro + '\'' +
            '}';
}
Answer 1

содержимое images можно распарсить так:

Map<String, ImageInfo> properties = new HashMap<>();
@JsonAnyGetter
public Map<String, ImageInfo> any() {
    return properties;
}
@JsonAnySetter
public void set(String name, ImageInfo value) {
    properties.put(name, value);
}

здесь ImageInfo - класс, описывающий содержимое блока 1/5/3/etc из примера

UPDATE: В коде класса в вопросе забыта инициализация Map

Map<String, PjColorImagesMain> properties_main = new HashMap<>();
READ ALSO
Как открыть страницу в новой вкладке в jsf?

Как открыть страницу в новой вкладке в jsf?

Сейчас я открываю вместо текущей:

243
Selenium WebDriver, 2 окна с одним и тем же handler

Selenium WebDriver, 2 окна с одним и тем же handler

Есть веб приложение с кнопкой, после нажатия на кнопку откывается 2 окно и нужно переключится на негоПроблема в том, что если я беру getWindowHandle()...

324
Проблема с подключением к базе данных Oracle

Проблема с подключением к базе данных Oracle

Развернул приложение на сервере tomcat, сразу же после этого, соединение устанавливается успешно, но примерно через 1 час не могу подключиться...

281
Java при заполнение listview nullpointer

Java при заполнение listview nullpointer

В строчке listView1setItems(data); вылетает NPE

224