2016-03-31 7 views
1

XMLをJavaに構文解析しようとしていますが、このXMLは大きな混乱です。Jacksonが同じPOJO内の別のアンラップされた要素をマップする

ジャクソンのように、各タイプの最後のオブジェクトが読み込まれ、各タイプの配列サイズは1つのオブジェクトしかありません。

編集:これは私が(デバッグをし、フォームオブジェクトの値を参照)を行うことをしようとしているものです:

public class Main { 

    public static void main(String[] args) throws IOException { 
     XmlMapper mapper = new XmlMapper(); 
     Form form = mapper.readValue(getXml(), Form.class); 
    } 

    public static String getXml() { 

     return "<forms>\n" 
      + " <circles><x>1</x></circles>\n" 
      + " <squares><x>1</x></squares>\n" 
      + " <squares><x>1</x></squares>\n" 
      + " <circles><x>1</x></circles>\n" 
      + " <squares><x>1</x></squares>\n" 
      + "</forms>"; 

    } 

} 

@JacksonXmlRootElement(localName = "forms") 
class Form { 

    @JacksonXmlElementWrapper(useWrapping = false) 
    @JacksonXmlProperty(localName = "circles", isAttribute = false) 
    private List<Circle> circles; 

    @JacksonXmlElementWrapper(useWrapping = false) 
    @JacksonXmlProperty(localName = "squares", isAttribute = false) 
    private List<Square> squares; 

    public List<Circle> getCircles() { 
     return circles; 
    } 

    public void setCircles(List<Circle> circles) { 
     this.circles = circles; 
    } 

    public List<Square> getSquares() { 
     return squares; 
    } 

    public void setSquares(List<Square> squares) { 
     this.squares = squares; 
    } 

} 

@JacksonXmlRootElement(localName = "circles") 
class Circle { 

    @JacksonXmlProperty(isAttribute = false) 
    private String x; 

    public String getX() { 
     return x; 
    } 

    public void setX(String x) { 
     this.x = x; 
    } 

} 

@JacksonXmlRootElement(localName = "squares") 
class Square { 

    @JacksonXmlProperty(isAttribute = false) 
    private String x; 

    public String getX() { 
     return x; 
    } 

    public void setX(String x) { 
     this.x = x; 
    } 

} 
+0

さらに詳しい情報を含める必要があります。どのようにやっているのかは明確ではありません。使い方を示すJavaコードが役立つはずです。しかし、私は、表示されているコードが混乱していることに同意します。それを使用可能なものにマップするのは簡単ではないかもしれません。しかし、 '@ JsonAnySetter'やsetterメソッドの特殊な扱いを、それらの分離した' points'と 'squares'要素に対して試みることができます。 – StaxMan

+0

詳細情報が追加されました。 – carf

+0

余分な情報についてのご意見はありますか? – carf

答えて

1

リストを初期化します。

@JacksonXmlElementWrapper(useWrapping = false) 
    @JacksonXmlProperty(localName = "circles", isAttribute = false) 
    private final List<Circle> circles = new ArrayList<>(); 

代わりに、すべての要素を追加します。

public void setCircles(List<Circle> circles) { 
     this.circles.addAll(circles); 
    } 

これはトリックです。 @StaxManに感謝します。

0

リストが非連続であるので、何が起こることは、彼らが個別に作成されますということです、前回のオーバーライドが先にオーバーライドされるようにします。これを解決するには、setCircles(など)を実装してリストに追加し、置き換えないでください。

関連する問題