zoukankan      html  css  js  c++  java
  • 【Java】Jackson解析xml的坑

    为了获取xml数据,在spring mvc中针对 @ResponseBody配置了jackson。

    刚用的时候内心是狂喜的,终于不用自己解析了…………

     but…………………………还是有坑的……

    坑一:大小写问题

    @JacksonXmlProperty(localName = "Apid")

    private Integer Apid;

    private Integer getApid()

    {

        return this.Apid

    }

    把注解放在成员变量上面,会解析出两个apid字段,一个是<Apid></Apid>,另一个是<apid><apid>

    这是因为Jackson的处理机制会自动从属性方法上获取成员变量名,然而在java中,要么以驼峰命名,要么前两个字母都大写,才能用get方法正确地获取属性,所以使用getApid获取的成员名称就是apid,被jackson解析了出来。又因为成员变量上也加了注解,所以也会被解析。这就造成了xml文件生成了两个apid标签。正确的做法是把注解写到get方法上面

    正确写法:

    private Integer Apid;

    @JacksonXmlProperty(localName = "Apid")

    private Integer getApid()

    {

        return this.Apid

    }

    坑二:Jackson封装list问题

    这个问题排查的时候异常困难……开始以为是封装的问题…………(吐槽一下,这个外包项目使用大量xml交互,但是又用不了webservice就得按照固定格式解析封装xml.....改动也贼困难。。。)……最后还是确定了是jackson的问题

    private List<Integer> APID;

    @JacksonXmlProperty(localName = "APID")
    @JacksonXmlElementWrapper(useWrapping = false)
    public List<Integer> getAPID() {
    return APID;
    }

    开始APID这个list一直被包装了两层!正确结果应该是<APID>111</APID>

    但是得到的是<APID><APID>111</APID></APID>

    问题出在JacksonXmlElementWrapper……………………如果不指定的话这个值默认是true………………………………………………………………………………………………

    为true的时候Jackson封装xml直接用xmlProperty的localName又封了一层…

    把这里改成false就好了

  • 相关阅读:
    leetcode58. 最后一个单词的长度 🌟
    leetcode53. 最大子序和 🌟
    leetcode38. 报数 🌟
    leetcode35. 搜索插入位置 🌟
    leetcode28. 实现strStr() 🌟
    ⚠️ Python 循环列表删除元素的注意事项
    leetcode27. 移除元素 🌟
    leetcode26. 删除排序数组中的重复项 🌟
    javascript 高阶函数 currying & uncurrying
    javascript 高阶函数 实现 AOP 面向切面编程 Aspect Oriented Programming
  • 原文地址:https://www.cnblogs.com/whutwxj/p/7345293.html
Copyright © 2011-2022 走看看