2

私の Jersey プロジェクトでは、MOXy を使用して JSON との間でマーシャリングを行っています。マーシャリングしたいクラスの 1 つは、空になる可能性のある文字列の配列です。

class Data
{
   @XmlElement(nillable = true) public String[] array;
}

配列が空の場合、出力は次のようになります。

{ 
   "array" : []
}

ただし、MOXy が出力から空の配列を除外しているようです。出力に空の配列を含めるにはどうすればよいですか?

JSONConfiguration.mapped().array("array").build() を MOXy プロバイダー コンストラクターに追加することを考えていましたが、これは違いがないようです (そして、それが正しい解決策であるかどうかさえわかりません)。 )。

4

1 に答える 1

2

注: 私はEclipseLink JAXB(MOXy)のリーダーであり、JAXB 2(JSR-222)エキスパートグループのメンバーです。

元の回答

次の拡張リクエストが入力されました。以下のリンクを使用して、この問題の進捗状況を追跡できます。


アップデート

2012年5月19日以降のEclipseLink2.4.0ラベルでは、次のプロパティを設定して、探している動作を取得できます。

marshaller.setProperty(MarshallerProperties.JSON_MARSHAL_EMPTY_COLLECTIONS, true);

毎晩のEclipseLinkラベルは次の場所からダウンロードできます。

次のクラスには、3つのListプロパティがあります。2つはListオブジェクトが空で、1つはnullです。emptyChoiceListフィールドは。でマップされていることに注意してください@XmlElements@XmlElements注釈は、可能なノード名がとfooであることを示していますbar

package forum10453441;

import java.util.*;
import javax.xml.bind.annotation.*;

@XmlType(propOrder={"nullList", "emptyList", "emptyChoiceList"})
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {

    private List<String> nullList = null;

    private List<String> emptyList = new ArrayList<String>();

    @XmlElements({
        @XmlElement(name="foo", type=String.class),
        @XmlElement(name="bar", type=String.class)
    })
    private List<String> emptyChoiceList = new ArrayList<String>();

}

デモ

次のコードは、MarshallerProperties.JSON_MARSHAL_EMPTY_COLLECTIONSプロパティを指定する方法を示しています。

package forum10453441;

import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.MarshallerProperties;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Root.class);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, "application/json");
        marshaller.setProperty(MarshallerProperties.JSON_MARSHAL_EMPTY_COLLECTIONS, true);

        Root root = new Root();
        marshaller.marshal(root, System.out);
    }

}

出力

これで、出力で空のリストが空の配列としてマーシャリングされます。指定されたノード名でマップされたフィールドは@XmlElememts、JSON表現で使用されました。

{
   "emptyList" : [ ],
   "foo" : [ ]
}
于 2012-05-08T19:33:58.740 に答える