java - JAXB:解码异构数组

标签 java json jaxb unmarshalling moxy

我正在尝试使用 MOXy 解码具有以下结构的 json:

[
  {
    "page": 1,
    "pages": 1
  },
  [
    {
        "indicator": {
            "id": "IC.BUS.EASE.XQ",
            "value": "Ease of doing business index"
        },
        "country": {
            "id": "1A",
            "value": "Arab World"
        },
        "value": "113.952380952381",
        "date": "2014"
    },
    ...
    ]
]

数组的第一个元素是一个对象,第二个元素是另一个复杂元素的数组。我真的在 SO 和 MOXy 文档中搜索了一个类似的例子,但没有成功。

我将 json 文档映射到 JAVA 类的最佳尝试如下。根类是 CountryDataResponse(省略了 getter 和 setter):

@XmlRootElement
@XmlType(propOrder ={"paginationInfo", "dataArray"})
public class CountryDataResponse {
    private DataArray dataArray;
    private PaginationInfo paginationInfo;
}

(我知道这会失败,因为它不是数组,但我完全迷失了。)

PaginationInfo 类模拟根数组的第一个元素,DataArray 类包装第二个元素,这是一个数据类元素数组。此外,我还为每个数据元素内的复杂类型创建了 Indicator 和 Country 类。

主要类(省略指标和国家/地区):

@XmlRootElement(name = "paginationInfo")
@XmlAccessorType(XmlAccessType.FIELD)
public class PaginationInfo {

    private int page;
    private int pages;
}

@XmlRootElement( name = "dataArray" )
public class DataArray {
    List<Data> datas;
}

@XmlRootElement(name="data")
@XmlAccessorType(XmlAccessType.FIELD)
public class Data {
    private Indicator indicator;
    private Country country;
    private String date;
    private double value;
}

现在,调试以下代码:

public static void main(String args[]) {
    String test = "[{\"page\": 1,\"pages\": 1,\"per_page\": \"1000\",\"total\": 248},"
                + "["
                + "{\"indicator\": {\"id\": \"NY.GDP.MKTP.CD\",\"value\": \"GDP (current US$)\"},"
                + "\"country\": {\"id\": \"1A\",\"value\": \"Arab World\"},"
                + "\"value\": \"2853079422103.94\","
                + "\"decimal\": \"1\","
                + "\"date\": \"2013\"},"
                + "{\"indicator\": {\"id\": \"NY.GDP.MKTP.CD\",\"value\": \"GDP (current US$)\"},"
                + "\"country\": {\"id\": \"S3\",\"value\": \"Caribbean small states\"},"
                + "\"value\": \"67033118185.1864\","
                + "\"decimal\": \"1\","
                + "\"date\": \"2013\"}"
                + "]]";

    JAXBContext jc = JAXBContext.newInstance(CountryDataResponse.class, Country.class, Data.class, DataArray.class, Indicator.class, PaginationInfo.class);
    Unmarshaller unmarshaller = jc.createUnmarshaller();
    unmarshaller.setProperty(UnmarshallerProperties.MEDIA_TYPE, MediaType.APPLICATION_JSON);
    unmarshaller.setProperty(UnmarshallerProperties.JSON_INCLUDE_ROOT, false);

    Object res = unmarshaller.unmarshal(json, CountryDataResponse.class);
}

res 对象(属于 JAXBElement 类)有一个ArrayList 类型的值。数组的第一个元素类CountryDataResponse的对象(它应该是PaginationInfo),第二个 是另一个ArrayList,其元素也属于 CountryDataResponse 类(它们应该 数据实例)。

谁能帮帮我,或者它只是一个格式错误的 json,无法正确地自动解码?

提前谢谢你。

最佳答案

虽然 JSON 是有效的,但我建议更改结构,大致如下:

{
"paginationInfo": {
    "page": 1,
    "pages": 1
},
"dataArray": [
    {
        "indicator": {
            "id": "IC.BUS.EASE.XQ",
            "value": "Ease of doing business index"
        },
        "country": {
            "id": "1A",
            "value": "Arab World"
        },
        "value": "113.952380952381",
        "date": "2014"
    }
]

这将允许您使用“键”名称提取您想要的数据,这正是 JSON 的用途。

另一种方法是将数据数组嵌入分页对象中:

{
"page": 1,
"pages": 1,
"dataArray": [
    {
        "indicator": {
            "id": "IC.BUS.EASE.XQ",
            "value": "Ease of doing business index"
        },
        "country": {
            "id": "1A",
            "value": "Arab World"
        },
        "value": "113.952380952381",
        "date": "2014"
    }
]

这种方法将允许您创建一个通用的页面包装器,如果您有多种格式要分页,这可能会很有用。

希望这对您有所帮助。

关于java - JAXB:解码异构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30165543/

相关文章:

java - 如何处理RequestMapping中的@Valid违规?

java - 如何在 Java 中正确实现自定义加载屏幕

javascript - 从js中的JSON获取第一级对象长度计数

java - 不带引号的 Jackson 字段值

java - 尝试运行 Spring boot 应用程序时出错。使用名称创建 bean 时出错

java - 创建名称为 'adminController' : Unsatisfied dependency expressed through field 'supplierDaoImpl' 的 bean 时出错

json - 访问 Node.js 中的 JSON 位置

java - JAXB 和 REST - XSD 的值(value)?

Eclipse 禁用自动源生成文件夹的警告

java - 调试 jaxb2 maven 插件