Борьба с картой JSON полезной нагрузки для класса модели - PullRequest
0 голосов
/ 11 марта 2020

Я пытаюсь сопоставить мою входящую json полезную нагрузку с массивом данных моего модельного класса. У меня есть решение, но оно не интуитивно понятно. Я пытаюсь сделать это, но получаю ошибки компиляции -

        ObjectMapper mapper = new ObjectMapper();
        ArrayList<ModelClass> = mapper.readValue(items, RoleAttribute.class);

К вашему сведению Я пытаюсь сохранить эти данные в коллекции Mon go.

Controller-

@PostMapping(value="/resource", consumes="application/json")
    public Iterable<ModeClass> createResources(@RequestBody JSONObject requestBody ) throws JsonParseException, JsonMappingException, IOException {

        System.out.println(requestBody.getClass());
        return serviceImpl.saveResources(requestBody);
    }

Модель класса-

@Data
@AllArgsConstructor
@Document(collection="collection-name")
public
class ModelClass{

    @Field
    private String ID;

    @Field
    private String description;
}

Полезная нагрузка поступает в следующем формате -

{
    "data": [
        {
            "ID": "1",
            "description": "desc1"
        },
        {
            "ID": "2",
            "description": "desc2"
        },
        {
            "ID": "3",
            "description": "desc3"
        },
        {
            "ID": "4",
            "description": "desc4"
        }
        ....

    ]
}

Я знаю, что должен использовать Джексона, но не могу понять это. Нужно ли менять мой POJO? Нужно ли создавать пользовательский конфиг Джексона?

Ответы [ 2 ]

0 голосов
/ 11 марта 2020

Вам потребуется класс контейнера для поля data, что-то вроде:

@Data
@Document(collection="collection-name")
public class DataClass{

    private List<ModelClass> data;
}

Выполнение этого через Джексона должно выполняться автоматически c в контроллере:

public Iterable<ModeClass> createResources(@RequestBody DataClass requestBody ) {
0 голосов
/ 11 марта 2020

Вы можете сделать это с аннотацией json. Я также заметил, что ваши значения представлены как data в json, поэтому об этом также необходимо позаботиться. Посмотрите на приведенный ниже код. Это решит вашу проблему.

import com.fasterxml.jackson.annotation.JsonProperty;

@Data
@AllArgsConstructor
@Document(collection="collection-name")
public class ModelClass{
    @Field
    @JsonProperty("ID")
    private String classID;

    @Field
    @JsonProperty("description")
    private String classDescription;

    public String getClassID() {
        return classID;
    }

    public void setClassID(String classID) {
        this.classID = classID;
    }

    public String getClassDescription() {
        return classDescription;
    }

    public void setClassDescription(String classDescription) {
        this.classDescription = classDescription;
    }
}

И класс данных оболочки, как показано ниже

class Data {
    ModelClass[] data;

    public ModelClass[] getData() {
        return data;
    }

    public void setData(ModelClass[] data) {
        this.data = data;
    }
}

И json Код преобразования, как показано ниже

        ObjectMapper mapper = new ObjectMapper();
        // json is your incoming json as a string. You can put inputstream also
        Data values = mapper.readValue(json, Data.class);
        System.out.println(values.getData().length);
        System.out.println(values.getData()[0].getClassID());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...