Cara mengabaikan node tertentu saat mengurai XML dengan Jackson

Saya ingin tahu apakah mungkin untuk mengabaikan satu atau banyak node saat mengurai XML menggunakan modul Jackson ML.

Saya ingin dapat mengurai XML ini

<bundle>
  <id value="myBundleId"/>
  <meta>
    <profile value="http://myurl/profile1" />
    <profile value="http://myurl/profile2" />
    <tag>
      <system value="https://myurl/system" />
      <code value="myAppCode"/>
    </tag>
  </meta>
  <type value="message" />
</bundle>

ke objek POJO ini

import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlElementWrapper;
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty;

import lombok.Data;

@Data
public class Bundle {

    @JacksonXmlElementWrapper(localName = "id")
    @JacksonXmlProperty(isAttribute = true, localName = "value")
    private String id;

    @JacksonXmlElementWrapper(localName = "type")
    @JacksonXmlProperty(isAttribute = true, localName = "value")
    private String type;
}

Saat ini tidak berfungsi karena menurut saya anotasi @JacksonXmlElementWrapper hanya berfungsi dengan daftar.

Itu juga memberi saya pesan kesalahan berikut:

java.lang.IllegalArgumentException: Definisi penyetel yang bertentangan untuk "nilai" properti


person Fred    schedule 08.08.2018    source sumber
comment
Coba ubah bidang Anda menjadi properti dan jadikan publik.   -  person ylax    schedule 08.08.2018
comment
Hmm, apa maksudmu sebenarnya? Saya harus menambahkan bahwa sayangnya XML tidak dapat dimodifikasi karena diberikan oleh pihak eksternal.   -  person Fred    schedule 08.08.2018


Jawaban (4)


Coba yang berikut ini:

@JsonIgnoreProperties(ignoreUnknown = true)
public class Bundle {
   ...
}

Kalau tidak:

mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
person cassiomolin    schedule 08.08.2018
comment
Terima kasih atas bantuan yang Anda sarankan karena memungkinkan untuk mengabaikan tag ‹meta› seperti yang saya inginkan. Apakah Anda juga tahu bagaimana saya bisa mengikat properti objek Java saya id ke nilai XML myBundleId tanpa harus membuat subkelas bernama Id ? - person Fred; 08.08.2018
comment
@Fred Anda dapat mencoba @JsonProperty. Tapi itu melampaui cakupan pertanyaan awal Anda. Silakan, ajukan pertanyaan baru dan tambahkan semua detail yang relevan ke dalamnya. - person cassiomolin; 09.08.2018
comment
@Fred Jika jawaban saya memecahkan masalah Anda saat ini, jangan lupa untuk memperbarui dan menerimanya :) - person cassiomolin; 09.08.2018

Jika saya ingat benar, Anda dapat mengatur ini pada objek mapper dan itu akan menghindari pengecualian yang diberikan pada node yang tidak cocok.

objectMapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, false);

person Rich Ackroyd    schedule 08.08.2018

untuk mengikat properti, Anda dapat menggunakan @JsonProperty Anotasi Jackson

person jker    schedule 08.08.2018

Jika Anda tidak keberatan menggunakan perpustakaan lain, SimpleXml melakukan ini secara default:

public class Bundle {
    @XmlWrapperTag("id")
    @XmlName("value")
    @XmlAttribute
    private String id;

    @XmlWrapperTag("type")
    @XmlName("value")
    @XmlAttribute
    private String type;
}

Dan kemudian membuat serial dan mencetak:

final SimpleXml simple = new SimpleXml();
final Bundle bundle = simple.fromXml(xml, Bundle.class);
System.out.println(bundle.id + " : " + bundle.type);

Ini akan mencetak:

myBundleId : message

SimpleXml ada di pusat pakar

<dependency>
    <groupId>com.github.codemonstur</groupId>
    <artifactId>simplexml</artifactId>
    <version>1.5.5</version>
</dependency>
person jurgen    schedule 11.08.2018