วิธีละเว้นโหนดเฉพาะเมื่อแยกวิเคราะห์ XML ด้วย Jackson

ฉันต้องการทราบว่าเป็นไปได้หรือไม่ที่จะเพิกเฉยต่อหนึ่งหรือหลายโหนดเมื่อแยกวิเคราะห์ XML โดยใช้โมดูล Jackson ML

ฉันต้องการที่จะแยกวิเคราะห์ XML นี้

<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>

ลงในวัตถุ POJO นี้

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;
}

ตอนนี้มันใช้งานไม่ได้เพราะฉันคิดว่าคำอธิบายประกอบ @JacksonXmlElementWrapper ใช้งานได้กับรายการเท่านั้น

นอกจากนี้ยังให้ข้อความแสดงข้อผิดพลาดต่อไปนี้แก่ฉัน:

java.lang.IllegalArgumentException: คำจำกัดความของตัวตั้งค่าที่ขัดแย้งกันสำหรับคุณสมบัติ "ค่า"


person Fred    schedule 08.08.2018    source แหล่งที่มา
comment
ลองเปลี่ยนฟิลด์ของคุณให้เป็นคุณสมบัติและเปิดเผยต่อสาธารณะ   -  person ylax    schedule 08.08.2018
comment
อืมคุณหมายถึงอะไรกันแน่? ฉันต้องเสริมว่าน่าเสียดายที่ XML ไม่สามารถแก้ไขได้เนื่องจากได้รับจากบุคคลภายนอก   -  person Fred    schedule 08.08.2018


คำตอบ (4)


ลองดังต่อไปนี้:

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

อีกทางหนึ่ง:

mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
person cassiomolin    schedule 08.08.2018
comment
ขอบคุณสิ่งที่คุณแนะนำ เพราะมันช่วยให้ไม่ต้องสนใจแท็ก ‹meta› เหมือนที่ฉันต้องการ คุณมีความคิดใดบ้างที่ฉันสามารถผูกคุณสมบัติวัตถุ Java ของฉัน id กับค่า XML myBundleId โดยไม่ต้องสร้างคลาสย่อยชื่อ Id ได้อย่างไร - person Fred; 08.08.2018
comment
@Fred คุณสามารถลอง @JsonProperty แต่มันเกินขอบเขตของคำถามเดิมของคุณ โปรดถามคำถามใหม่และเพิ่มรายละเอียดที่เกี่ยวข้องทั้งหมดลงไป - person cassiomolin; 09.08.2018
comment
@Fred หากคำตอบของฉันแก้ไขปัญหาปัจจุบันของคุณได้ อย่าลืมอัปเดตและยอมรับ :) - person cassiomolin; 09.08.2018

ถ้าฉันจำได้ถูกต้อง คุณสามารถตั้งค่านี้บน object mapper และมันจะหลีกเลี่ยงข้อยกเว้นที่จะเกิดขึ้นบนโหนดที่ไม่ตรงกัน

objectMapper.configure (DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES, เท็จ);

person Rich Ackroyd    schedule 08.08.2018

เพื่อผูกคุณสมบัติ คุณสามารถใช้ @JsonProperty Jackson Annotations

person jker    schedule 08.08.2018

หากคุณไม่รังเกียจที่จะใช้ไลบรารีอื่น SimpleXml จะดำเนินการนี้ตามค่าเริ่มต้น:

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

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

จากนั้นทำให้เป็นอนุกรมและพิมพ์:

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

สิ่งนี้จะพิมพ์:

myBundleId : message

SimpleXml อยู่ในศูนย์กลางของ Maven

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