Как создать класс Jackson XML POJO для JsonObject из JsonObjects - PullRequest
0 голосов
/ 20 февраля 2019

Я пытаюсь создать POJO для следующей структуры JSON.Узел Fields достаточно легко подключить, но я не уверен, как использовать аннотации для подключения узла Description.Если бы я определял структуру JSON для этого узла, я бы создал JsonArray из JsonObjects, который упростил бы класс java, но, поскольку я этого не сделал, мне нужно выяснить, как сериализовать структуру ниже:

{
    "Fields": {
        "Required": ["ftp.hostname"],
        "Optional": ["ftp.rootDirectory"]
    },
    "Description": {
        "ftp.hostname": {
            "label": "SFTP Hostname",
            "description": "SFTP server hostname or IP address"
        },
        "ftp.rootDirectory": {
            "label": "Root Directory",
            "description": "The root path on the Data Store accessible by this connector"
        }
    }
}

Обратите внимание, что узлы в объекте Description имеют имена, которые соответствуют значениям, определенным в узле Fields, что означает, что их имена узлов могут варьироваться от полезной нагрузки к полезной нагрузке.

Класс для узла Fields:

public class FieldDetails {

    public static final String REQUIRED = "Required";
    public static final String OPTIONAL = "Optional";

    @JsonProperty(value = REQUIRED, required = true)
    private List<String> required;

    @JsonProperty(value = OPTIONAL, required = true)
    private List<String> optional;
}

И что у меня есть для всего объекта:

public class FieldDefinitions {

    public static final String FIELDS = "Fields";
    public static final String DESCRIPTION = "Description";

    @JsonProperty(value = FIELDS, required = true)
    private FieldDetails fields;

    @JsonProperty(value = DESCRIPTION , required = true)
    private ??? descriptions;
}

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Как правило, вы всегда можете сопоставить любой JSON объект с Map<String, Object>.Если JSON сложен со многими вложенными объектами, Jackson автоматически выберет правильный тип: Map для объектов и List для массивов.

Вы также можете объявить класс, как показано ниже, для Description свойств,

class Description {
    private String label;
    private String description;
    // getters, setters, toString
}

Целое Description - это большое JSON, которое вы можете сопоставить с Map<String, Description>.Итак, это может выглядеть так:

class FieldDefinitions {

    public static final String FIELDS = "Fields";
    public static final String DESCRIPTION = "Description";

    @JsonProperty(value = FIELDS, required = true)
    private FieldDetails fields;

    @JsonProperty(value = DESCRIPTION, required = true)
    private Map<String, Description> descriptions;

    // getters, setters, toString
}

Отдых такой же.Пример приложения:

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.io.File;
import java.util.List;
import java.util.Map;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        File json = new File("./resource/test.json").getAbsoluteFile();

        ObjectMapper mapper = new ObjectMapper();

        FieldDefinitions fields = mapper.readValue(json, FieldDefinitions.class);
        System.out.println("Required");
        fields.getFields().getRequired().forEach(r ->
                System.out.println(r + " = " + fields.getDescriptions().get(r)));
        System.out.println("Optional");
        fields.getFields().getOptional().forEach(r ->
                System.out.println(r + " = " + fields.getDescriptions().get(r)));
    }
}

Для заданных JSON payload отпечатков:

Required
ftp.hostname = Description{label='SFTP Hostname', description='SFTP server hostname or IP address'}
Optional
ftp.rootDirectory = Description{label='Root Directory', description='The root path on the Data Store accessible by this connector'}
0 голосов
/ 20 февраля 2019

Это структура.

public class FieldDefinitions {
    @JsonProperty("Fields")
    public FieldDetails fields = new FieldDetails();

    @JsonProperty("Description")
    public Map<String, Property> properties = new HashMap<>();
}

public class FieldDetails {
    @JsonProperty("Required")
    public List<String> required = new ArrayList<>();

    @JsonProperty("Optional")
    public List<String> optional = new ArrayList<>();
}

public class Property {
    public String label;
    public String description;
}
...