JAXB将Java List转换为对象集,从而丢失列表排序

时间:2013-02-25 16:25:25

标签: xml json jaxb jaxb2 jettison

我有一个用于UI控件的XML架构,其外观类似于以下XML

<InputParameters>
    <Combobox name="Combo1">...</Combobox>
    <Radiobutton name="Radio1">...</Radiobutton>
    <Combobox name="Combo2">...</Combobox>
    <Combobox name="Combo2">...</Combobox>
</InputParameters>

以下是InputParameters(另一个JAXB元素中的字段)的声明方式:

    @XmlElementWrapper(name="InputParameters")
    @XmlElementRefs(
        {
            @XmlElementRef(name="Combobox",     type=ComboboxJAXB.class),
            @XmlElementRef(name="RadioButtonGroup", type=RadioButtonGroup.class)
        }
        )
    protected List<? extends InputComponent> inputParameters;

这里有几个要点:

  • InputParameters中的项目顺序非常重要
  • ComboboxRadiobutton在架构中都具有相同的替换组头(InputComponent

也可能值得观察:

  • InputParameters可以(而且)被认为是Map,其中@name属性是(唯一)键
  • 由于顺序很重要,因此必须是Java LinkedHashMap

编组的XML输出(如上所示)很好。我遇到麻烦的地方是JAX-RS将其输出为JSON。

在JSON中,输出类似于:

{
    InputParameters : {
       Combobox : {.....},
       Radiobutton : {.......},
       Combobox : {.....},
       Combobox : {.....},
       }
}

这里的问题是:

  • InputParameters对象有多个名为“Combobox”的属性
  • 因为InputParameters是一个对象而不是一个数组,所以没有表示项目的顺序

问题归结为:我可以让JAXB输出InputParameters的内容作为(有序)数组而不是(无序)对象集吗?或许我应该考虑一些非常不同的方法?

所需的JSON输出看起来更像:

{
    InputParameters : 
      [
         {Combobox : {.....}},
         {Radiobutton : {.......}},
         {Combobox : {.....}},
         {Combobox : {.....}},
      ]
}

我正在使用JAXB的参考实现。

0 个答案:

没有答案