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就好了

  • 相关阅读:
    jQuery--隐藏事件
    正则表达式(全)
    1、简单的页面登录、下拉菜单、数据库查询
    1/多态的应用...
    PHP中的魔术方法:__construct, __destruct , __call,__get, __set, __isset, __unset , __toString, __set,__clone and __autoload
    1、php----自动加载类 __autoload()函数
    1、面向对象上课笔记。。。
    1、遍历数组知识
    1、php基本语法--函数
    1、刚学php感觉真有意思!
  • 原文地址:https://www.cnblogs.com/whutwxj/p/7345293.html
Copyright © 2011-2022 走看看