Java 解组数组不会给我任何值
当我解组我的JSON时,仓库实例就可以了,不管它的列表中有多少仓库实例 每个仓库实例都有url字段,但WarehouseField列表中有一个实例的值为空 我不确定我错过了什么 JSONJava 解组数组不会给我任何值,java,json,jaxb,unmarshalling,moxy,Java,Json,Jaxb,Unmarshalling,Moxy,当我解组我的JSON时,仓库实例就可以了,不管它的列表中有多少仓库实例 每个仓库实例都有url字段,但WarehouseField列表中有一个实例的值为空 我不确定我错过了什么 JSON { "warehouses": [ { "warehouse": { "PRiyA": "0", "WHID": "1 ALABO", "PRixA": ""
{
"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专业知识的人可以详细说明地图