代码之家  ›  专栏  ›  技术社区  ›  Christopher Smith

取消数组的编排没有给我任何值

  •  0
  • Christopher Smith  · 技术社区  · 6 年前

    当我取消标记JSON时,仓库实例是正常的,不管列表中有多少仓库实例。

    每个仓库实例都有URL字段,但仓库字段列表有一个值为空的实例。

    我不知道我遗漏了什么。

    杰森

    {
        "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 回复  |  直到 6 年前
        1
  •  1
  •   pirho    6 年前

    首先,我建议您将所有字段设为私有,您的字段具有getter和setter。

    将响应分离也是一个好主意(?)字段中的dto类名和实际类型命名。

    假设响应DTO中的字段名告诉实际的类型,然后像这样做一点重构 Warehouses WarehousesResponse Warehouse WarehouseResponse .

    然后关于“数组”,从JSON中剪辑:

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

    这不是名为Warehouse的数组,因此它不会反序列化为 List 很好地。

    它是一个类型的对象 仓库 (这就是区分仓库响应的原因,为了清楚起见,参见 Map 稍后)这是类型为的对象中名为Warehouse的字段 仓库响应 (假设您同意命名策略)。

    一种选择是创建类,如:

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

    改变仓库的反应,比如:

    @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> 所以在这种情况下 仓库响应 S也可以 private HashMap<String, String> warehouse 没有阶级 仓库 需要。但是我不能让它和我的 Moxy 知识。

    因此,我介绍了如何反序列化(和序列化)您在JSON中给出的格式,但我不知道这是否适合您的可能。 XML 需要