【问题标题】:jackson xmlmapper for map <String, Object>, react for specific tagjackson xmlmapper for map <String, Object>,对特定标签做出反应
【发布时间】:2019-08-12 12:42:54
【问题描述】:

我有这个 xml 结构:

    <Result>
      <ReferenceMin>4</ReferenceMin>
      <ReferenceMax>5.65</ReferenceMax>
      <PrecedingValue>3.25</PrecedingValue>
      <PrecedingDate><Date year="2017"  month="04"    day="21"/></PrecedingDate>
    </Result>

这个 xml 来自无法控制的第三方服务,它可以包含新的字段,或者现有的字段可以消失,所以我不能为对象定义严格的结构。如我所见,除了 PrecedingDate 之外,所有字段都可以解析为“字符串”。

是否可以通过我的 cyustom 策略教 jackson xmlMapper 使用 PrecedingDate 或 Date 字段?目前它创建具有这种结构的对象:

{PrecedingDate: Date: {year: 2017, month: 04, day: 21}}

我想获取 java 日期或即时或类似的东西。

【问题讨论】:

    标签: java xml-parsing jackson


    【解决方案1】:

    您可以实现自定义反序列化器或使用JsonAnySetter 注释。如何使用注释您可以在下面找到:

    import com.fasterxml.jackson.annotation.JsonAnySetter;
    import com.fasterxml.jackson.dataformat.xml.XmlMapper;
    
    import java.io.File;
    import java.time.LocalDate;
    import java.util.HashMap;
    import java.util.Map;
    
    public class XmlMapperApp {
    
        public static void main(String[] args) throws Exception {
            File xmlFile = new File("./resource/test.xml").getAbsoluteFile();
    
            XmlMapper xmlMapper = new XmlMapper();
            System.out.println(xmlMapper.readValue(xmlFile, Result.class));
        }
    }
    
    class Result {
    
        private Map<String, String> entries = new HashMap<>();
        private LocalDate precedingDate;
    
        public Map<String, String> getEntries() {
            return entries;
        }
    
        public LocalDate getPrecedingDate() {
            return precedingDate;
        }
    
        @JsonAnySetter
        public void setEntry(String key, Object value) {
            if ("PrecedingDate".equals(key)) {
                Map<String, String> date = (Map<String, String>)((Map) value).get("Date");
                precedingDate = LocalDate.of(
                        Integer.parseInt(date.get("year")),
                        Integer.parseInt(date.get("month")),
                        Integer.parseInt(date.get("day")));
            } else {
                entries.put(key, value.toString());
            }
        }
    
        @Override
        public String toString() {
            return "Result{" +
                    "entries=" + entries +
                    ", precedingDate=" + precedingDate +
                    '}';
        }
    }
    

    上面的代码打印:

    Result{entries={ReferenceMin=4, PrecedingValue=3.25, ReferenceMax=5.65}, precedingDate=2017-04-21}
    

    【讨论】:

      猜你喜欢
      • 2014-05-19
      • 2018-08-24
      • 1970-01-01
      • 2021-09-07
      • 2012-12-04
      • 2017-05-09
      • 1970-01-01
      • 1970-01-01
      • 2018-09-22
      相关资源
      最近更新 更多