java - 解码数组不会给我任何值

标签 java json jaxb unmarshalling moxy

当我解码 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();

模型类

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>
}

最佳答案

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

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

假设响应 DTO 中的字段名称告诉实际类型,然后进行一些重构,如 WarehousesWarehousesResponseWarehouseWarehouseResponse .

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

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

这不是一个名为仓库的数组,因此它不会反序列化为 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并且没有类(class)Warehouse将需要。但是我无法让它与我的 Moxy 一起工作知识。

所以我介绍了如何反序列化(和序列化)您在 JSON 中提供的格式,但我不知道这是否适合您可能的 XML需求

关于java - 解码数组不会给我任何值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52277945/

相关文章:

java - 使用 GSON 解析没有数组名称的 JSON 字符串

json - 将扩展属性序列化为 JSON

java - 让 JAXB 在编码到 XML 时强制执行 XSD 限制

java - Jaxb + Jersey 。跳过生成的 json 中的空字段

java - 当 git push 到远程仓库时出现错误 "File java_pid66619.hprof is 661.61 MB; this exceeds GitHub' s 文件大小限制为 100.00 MB"

java - 如何使用 Selenium TestNG 和 Java 转换和匹配背景颜色 RGB(255, 255, 255) 与#fff

php - jQuery | Ajax,如何从外部 PHP 文件中接收的数据中操作数组键?

javascript - 如何将路径数组转换为JSON结构?

java - 如何自定义SpringWebFlux WebClient xml+rss JAXB反序列化?

java - java和奇怪的XML在Android Studio(3.2.1)中损坏的java和xml文件