Java 解组数组不会给我任何值

Java 解组数组不会给我任何值,java,json,jaxb,unmarshalling,moxy,Java,Json,Jaxb,Unmarshalling,Moxy,当我解组我的JSON时,仓库实例就可以了,不管它的列表中有多少仓库实例 每个仓库实例都有url字段,但WarehouseField列表中有一个实例的值为空 我不确定我错过了什么 JSON { "warehouses": [ { "warehouse": { "PRiyA": "0", "WHID": "1 ALABO", "PRixA": ""

当我解组我的JSON时,仓库实例就可以了,不管它的列表中有多少仓库实例

每个仓库实例都有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();
publicstaticvoidmain(字符串[]args)引发异常{
Class[]ctx={Warehouses.Class,WarehouseField.Class};
JAXBContext jc=JAXBContext.newInstance(ctx);
解组器um=jc.createUnmarshaller();
setProperty(UnmarshallerProperties.MEDIA_类型,“application/json”);
setProperty(UnmarshallerProperties.JSON_INCLUDE_ROOT,false);
Source json=newstreamsource(新文件(“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>
}
公共类仓库{
公开名单仓库;
公共字符串url;
公共字符串状态;
}
公共类仓库{
公共列表仓库;
公共字符串url;
}
公共类仓库场{
@XmlAttribute
公共字符串名称;
@XmlValue
公共字符串值;
}

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

将响应(?)DTO类名与字段和实际类型命名分开也是一个好主意

假设响应DTO中的字段名告诉实际类型,然后执行一些重构,如
仓库
仓库响应
仓库
仓库响应

关于“数组”,来自JSON的剪辑:

"warehouse": {
    "PRiyA": "0",
    "WHID": "1 ALABO",
    "PRixA": ""
}
这不是一个名为warehouse的数组,因此它不能反序列化到
列表

它是
仓库
类型的对象(这就是区分WarehouseResponse的原因,为了清楚起见,但也请参见下文提及的
映射
),它是
仓库响应
类型的对象中名为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();

}
@Getter@Setter
公共类仓库响应{
//将列表更改为仓库对象作为响应
//私有列表仓库;
私人仓库;
私有字符串url;
私有日期=新日期();
}
通常也可以简单地将键/值对设置为
Map
,例如,在这种情况下
WarehouseResponse
s也可以拥有
私有HashMap仓库
,并且不需要类
仓库
。但是,我无法使用我的
Moxy
知识


因此,我介绍了如何对JSON中提供的格式进行反序列化(和序列化),但我不知道这是否符合您可能的
XML
需求

谢谢。地图将更好地满足我的需求,我最初的尝试失败了。也许具有MOXY专业知识的人可以详细说明地图