Распаковка массива не дает мне никаких значений - PullRequest
0 голосов
/ 11 сентября 2018

Когда я отменяю маршализацию своего JSON, экземпляр Warehouses в порядке, но в его списке много экземпляров хранилища.

Каждый экземпляр хранилища имеет поле url, но в списке WarehouseField есть один экземпляр с пустыми значениями.

Я не уверен, что мне не хватает.

JSON

{
    "warehouses": [
        {
            "warehouse": {
                "PRiyA": "0",
                "WHID": "1 ALABO",
                "PRixA": ""
            },
            "url": "http://ACL-HPDV6:8080/HSyncREST/api/v1/warehouses/PLL/1 ALABO"
        },
        {
            "warehouse": {
                "PRiyA": "0",
                "WHID": "1000 EDWAR",
                "PRixA": ""
            },
            "url": "http://ACL-HPDV6:8080/HSyncREST/api/v1/warehouses/PLL/1000 EDWAR"
        },
    ],
    "url": "http://ACL-HPDV6:8080/HSyncREST/api/v1/warehouses/PLL",
    "status": " "
}

Код, используемый для демаршалла

public static void main(String[] args) throws Exception {
  Class<?>[] ctx = {Warehouses.class, Warehouse.class, WarehouseField.class};
  JAXBContext jc = JAXBContext.newInstance(ctx);
  Unmarshaller um = jc.createUnmarshaller();
  um.setProperty(UnmarshallerProperties.MEDIA_TYPE, "application/json");
  um.setProperty(UnmarshallerProperties.JSON_INCLUDE_ROOT, false);
  Source json = new StreamSource(new File("D:/warehouses.json"));
  Warehouses warehouses = um.unmarshal(json, Warehouses.class).getValue();

Модельные классы

public class Warehouses {
    public List<Warehouse> warehouses;
    public String url;
    public String status;
    <getters and setters>
}

public class Warehouse {
    public List<WarehouseField> warehouse;
    public String url;
    <getters and setters>
}

public class WarehouseField {
    @XmlAttribute
    public String implName;
    @XmlValue
    public String value;
    <getters and setters>
}

1 Ответ

0 голосов
/ 11 сентября 2018

Прежде всего, я предлагаю вам сделать все поля приватными, у вас есть геттеры и сеттеры для ваших полей.

Также неплохо отделить имя класса ответа DTO (?) От имени поля и фактического именования типа.

Предполагая, что имена полей в DTO ответа указывают фактический тип,затем выполните рефакторинг, например, Warehouses в WarehousesResponse и Warehouse в WarehouseResponse.

. Затем о массиве, выделенном из JSON:

"warehouse": {
    "PRiyA": "0",
    "WHID": "1 ALABO",
    "PRixA": ""
}

thisне является массивом с именем хранилища, поэтому его нельзя десериализовать до List.

Это объект типа Warehouse (поэтому для ясности различие WarehouseResponse, но см. также упоминание о Map позже) это поле с именем хранилища в объекте типа WarehouseResponse (при условии, что вы согласны с политикой именования).

Один из вариантов - создать класс, подобный:

@Getter @Setter
public class Warehouse {
    private String PRiyA;
    private String WHID;
    private String PRixA;
}

и изменить WarehouseResponseнапример:

@Getter @Setter
public class WarehouseResponse {
// Change the list to warehouse object as it is in response
//      private List<WarehouseField> warehouse; 
    private Warehouse warehouse;
    private String url;
    private Date date = new Date();

}

Обычно также можно установить пары ключ / значение просто - например, на Map<String,String>, поэтому в этом случае WarehouseResponse s также может иметь private HashMap<String, String> warehouse и неКласс Warehouse будет необходимо.Однако я не смог заставить его работать со своими Moxy знаниями.

Поэтому я представил, как вы можете десериализовать (и сериализовать) формат, который вы указали в вашем JSON, но я не могу знать, что это тогда соответствует вашим возможным XML потребности

...