Преобразование Json в массив DTO

У меня есть интересная проблема с разбором JSON, по крайней мере для меня, так как я делаю это впервые. У меня есть следующий образец JSON, и я хочу сопоставить его с эквивалентными DTO:

{
    "modules":
    [
        {
            "name":"module1",
            "shortId":23425,
            "pmns":
            [
                {
                    "name":"pmn1",
                    "position":1,
                    "pmnType":"D3"
                },
                {
                    "name":"pmn3",
                    "position":3,
                    "pmnType":"R2"
                },
                {
                    "name":"pmn7",
                    "position":5,
                    "pmnType":"S1"
                },
            ]
        },
        {
            "name":"module2",
            "shortId":1572,
            "pmns":
            [
                {
                    "name":"pmn1",
                    "position":3,
                    "pmnType":"D3"
                },
                {
                    "name":"pmn12",
                    "position":35,
                    "pmnType":"R2"
                },
            ]
        }
    ]
}

Это мой класс ModuleDTO:

public class ModuleDTO {

    private String _name;
    private short _shortId;
    private PmnDTO[] _pmns;

    public String getName() {
        return _name;
    }

    public short getShortId() {
        return _shortId;
    }

    public PmnDTO[] getPmns() {
        return _pmns;
    }

    @JsonProperty("name")
    public void setName(String name) {
        this._name = name;
    }

    @JsonProperty("shortId")
    public void setShortId(short shortId) {
        this._shortId = shortId;
    }

    @JsonProperty("pmns")
    public void setPmns(PmnDTO[] pmns) {
        this._pmns = pmns;
    }

}

Здесь не скопировано, но мой класс PmnDTO похож, то есть геттеры и сеттеры для каждого свойства в объекте pmn JSON.

Я написал следующий код, чтобы попытаться сопоставить его с DTO. Я использую библиотеку com.FasterXml.jackson (версия 2.3.1).

// Got the response, construct a DTOs out of it ...
ObjectMapper mapper = new ObjectMapper();
StringReader reader = new StringReader(response); // Json Response

// Convert the JSON response to appropriate DTO ...
ModuleDTO moduleDto = mapper.readValue(reader, ModuleDTO.class);

Очевидно, этот код не работал. Может кто-нибудь сказать, как я могу сопоставить ответ JSON с моими DTO, учитывая, что «модули» представляют собой массив в JSON, а также содержат массив переменного размера внутри себя.

Благодарю вас.

(*Випул)() ;


person sgsi    schedule 03.04.2014    source источник
comment
Очевидно ничего не значит. Расскажите нам, как именно это не удалось, какие исключения были выброшены и что вы ожидали.   -  person Sotirios Delimanolis    schedule 04.04.2014
comment
Структура Json, которая у вас есть, не соответствует вашему DTO. Он соответствует массиву ModuleDTO. Вы можете определить класс ModuleList с одним атрибутом модуля ArrayList‹ModuleDTO›; а затем передать ModuleList.class парсеру   -  person hellboy    schedule 04.04.2014
comment
3 Приветствую вас, посыльный :-) Я определил следующий класс в соответствии с вашим предложением и бинго !!! ------ пакет com.sgsi.modulestructure.dto; импортировать java.util.ArrayList; импортировать com.fasterxml.jackson.annotation.JsonIgnoreProperties; импортировать com.fasterxml.jackson.annotation.JsonProperty; @JsonIgnoreProperties (ignoreUnknown = true) открытый класс ModuleListDTO { private ArrayList‹ModuleDTO› модули; public ArrayList‹ModuleDTO› getModule() { return this.modules; } @JsonProperty(modules) public void setModule(ArrayList‹ModuleDTO›modules) { this.modules = modules; } } Спасибо.   -  person sgsi    schedule 04.04.2014


Ответы (1)


Прежде всего, ваш JSON недействителен, поэтому я подозреваю, что вместо этого вы хотите это:

{
    "modules": [
        {
            "name": "module1",
            "shortId": 23425,
            "pmns": [
                {
                    "name": "pmn1",
                    "position": 1,
                    "pmnType": "D3"
                },
                {
                    "name": "pmn3",
                    "position": 3,
                    "pmnType": "R2"
                },
                {
                    "name": "pmn7",
                    "position": 5,
                    "pmnType": "S1"
                }
            ]
        },
        {
            "name": "module2",
            "shortId": 1572,
            "pmns": [
                {
                    "name": "pmn1",
                    "position": 3,
                    "pmnType": "D3"
                },
                {
                    "name": "pmn12",
                    "position": 35,
                    "pmnType": "R2"
                }
            ]
        }
    ]
}

Затем вы можете использовать онлайн-преобразование из JSON в POJO здесь, и вы получите следующий результат:

-----------------------------------com.example.Example.java-------- ---------------------------

package com.example;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Generated;
import javax.validation.Valid;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonInclude(JsonInclude.Include.NON_NULL)
@Generated("org.jsonschema2pojo")
@JsonPropertyOrder({
"modules"
})
public class Example {

@JsonProperty("modules")
@Valid
private List<Module> modules = new ArrayList<Module>();
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

@JsonProperty("modules")
public List<Module> getModules() {
return modules;
}

@JsonProperty("modules")
public void setModules(List<Module> modules) {
this.modules = modules;
}

@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}

@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}

}

-----------------------------------com.example.Module.java-------- ---------------------------

package com.example;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Generated;
import javax.validation.Valid;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonInclude(JsonInclude.Include.NON_NULL)
@Generated("org.jsonschema2pojo")
@JsonPropertyOrder({
"name",
"shortId",
"pmns"
})
public class Module {

@JsonProperty("name")
private String name;
@JsonProperty("shortId")
private Integer shortId;
@JsonProperty("pmns")
@Valid
private List<Pmn> pmns = new ArrayList<Pmn>();
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

@JsonProperty("name")
public String getName() {
return name;
}

@JsonProperty("name")
public void setName(String name) {
this.name = name;
}

@JsonProperty("shortId")
public Integer getShortId() {
return shortId;
}

@JsonProperty("shortId")
public void setShortId(Integer shortId) {
this.shortId = shortId;
}

@JsonProperty("pmns")
public List<Pmn> getPmns() {
return pmns;
}

@JsonProperty("pmns")
public void setPmns(List<Pmn> pmns) {
this.pmns = pmns;
}

@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}

@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}

}

-----------------------------------com.example.Pmn.java-------- ---------------------------

package com.example;

import java.util.HashMap;
import java.util.Map;
import javax.annotation.Generated;
import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonInclude(JsonInclude.Include.NON_NULL)
@Generated("org.jsonschema2pojo")
@JsonPropertyOrder({
"name",
"position",
"pmnType"
})
public class Pmn {

@JsonProperty("name")
private String name;
@JsonProperty("position")
private Integer position;
@JsonProperty("pmnType")
private String pmnType;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

@JsonProperty("name")
public String getName() {
return name;
}

@JsonProperty("name")
public void setName(String name) {
this.name = name;
}

@JsonProperty("position")
public Integer getPosition() {
return position;
}

@JsonProperty("position")
public void setPosition(Integer position) {
this.position = position;
}

@JsonProperty("pmnType")
public String getPmnType() {
return pmnType;
}

@JsonProperty("pmnType")
public void setPmnType(String pmnType) {
this.pmnType = pmnType;
}

@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}

@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}

}
person Paulo Fidalgo    schedule 03.09.2014
comment
можно ли это сделать без создания класса POJO. Я имею в виду прямое преобразование в объект DTO. - person warrior107; 04.01.2018
comment
Большое спасибо за ссылку на онлайн-генератор!!! - person Bram Luyten; 21.02.2021