解组数组没有给我任何值
Unmarshalling an array is not giving me any values
当我解组我的 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>
}
首先,我建议您将所有字段设为私有,您的字段有 getter 和 setter。
将响应 (?) DTO class 名称与字段和实际类型命名分开也是一个好主意。
假设响应 DTO 中的字段名称告诉实际类型,然后进行一些重构,例如 Warehouses
到 WarehousesResponse
和 Warehouse
到 WarehouseResponse
。
然后关于 "array",来自 JSON 的剪辑:
"warehouse": {
"PRiyA": "0",
"WHID": "1 ALABO",
"PRixA": ""
}
这不是一个名为 warehouse 的数组,因此它不能很好地反序列化为 List
。
它是一个 Warehouse
类型的对象(这就是区分 WarehouseResponse 的原因,为清楚起见,但另请参阅稍后提到的 Map
),它是 [=16] 类型对象中名为仓库的字段=](假设您同意命名政策)。
一个选择是创建一个 class 比如:
@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();
}
通常也可以将 key/value-pairs 简单地设置为 Map<String,String>
,例如 Map<String,String>
,因此在这种情况下 WarehouseResponse
s 也可以有 private HashMap<String, String> warehouse
而没有需要 class Warehouse
。但是我无法用我的 Moxy
知识让它工作。
所以我介绍了如何反序列化(和序列化)您在 JSON 中提供的格式,但我不知道这是否适合您可能的 XML
需求
当我解组我的 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>
}
首先,我建议您将所有字段设为私有,您的字段有 getter 和 setter。
将响应 (?) DTO class 名称与字段和实际类型命名分开也是一个好主意。
假设响应 DTO 中的字段名称告诉实际类型,然后进行一些重构,例如 Warehouses
到 WarehousesResponse
和 Warehouse
到 WarehouseResponse
。
然后关于 "array",来自 JSON 的剪辑:
"warehouse": {
"PRiyA": "0",
"WHID": "1 ALABO",
"PRixA": ""
}
这不是一个名为 warehouse 的数组,因此它不能很好地反序列化为 List
。
它是一个 Warehouse
类型的对象(这就是区分 WarehouseResponse 的原因,为清楚起见,但另请参阅稍后提到的 Map
),它是 [=16] 类型对象中名为仓库的字段=](假设您同意命名政策)。
一个选择是创建一个 class 比如:
@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();
}
通常也可以将 key/value-pairs 简单地设置为 Map<String,String>
,例如 Map<String,String>
,因此在这种情况下 WarehouseResponse
s 也可以有 private HashMap<String, String> warehouse
而没有需要 class Warehouse
。但是我无法用我的 Moxy
知识让它工作。
所以我介绍了如何反序列化(和序列化)您在 JSON 中提供的格式,但我不知道这是否适合您可能的 XML
需求