解决使用json-lib包实现xml转json时空值被转为空中括号的问题

yizhihongxing

首先,我们需要了解为什么会出现空值被转为空中括号的问题。这是因为json-lib默认不支持将空值转化为null,而将空值转化为空数组,为空数组的标志就是"[]"空中括号。

那么解决这个问题的方法就是需要我们手动配置json-lib。具体操作如下:

  1. 首先,引入json-lib的jar包到项目中,并且依赖于lib目录下的ezmorph.jar, commons-beanutils.jar, commons-lang.jar三个jar包。

  2. 然后在代码中使用JSONObject.fromObject()方法将XML字符串转换成JSON对象。如下所示:

String xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><Response><result>success</result><data><name>张三</name><age>20</age><sex></sex></data></Response>";
JSONObject jsonObject = JSONObject.fromObject(xmlStr);
  1. 接下来,我们需要配置JsonConfig:
JsonConfig config = new JsonConfig();
config.setPropertySetStrategy(new PropertySetStrategy() {
    @Override
    public void setProperty(Object o, String s, Object o1) throws JSONException {
        if (o1 == null) {
            return;
        }
        FormattedJsonValue value = new FormattedJsonValue(o1.toString().trim());
        ((JSONObject) o).accumulate(s, value);
    }
});

// internal FormattedJsonValue class
public class FormattedJsonValue {
    private final String value;

    public FormattedJsonValue(String value) {
        this.value = value;
    }

    @Override
    public String toString() {
        if (StringUtils.isBlank(value)) {
            return null;
        }
        return value;
    }
}

其中,我们使用了自定义的FormattedJsonValue类,将空值转换成null。通过配置JsonConfig中的setPropertySetStrategy方法实现将空值转换成null的目的。

  1. 最后,我们再次将XML字符串转换成JSON对象,这一次我们使用JsonConfig进行配置:
JSONObject jsonObject = JSONObject.fromObject(xmlStr, config);

这样,就避免了空值被转化为空中括号的问题。

示例1:将以下XML字符串转换成JSON对象,其中sex节点为null:

<?xml version="1.0" encoding="UTF-8"?>
<response>
    <result>success</result>
    <data>
        <name>张三</name>
        <age>20</age>
        <sex></sex>
    </data>
</response>

通过以上的配置,sex节点会被自动转换成null。

示例2:将以下XML字符串转换成JSON对象,其中sex节点不存在:

<?xml version="1.0" encoding="UTF-8"?>
<response>
    <result>success</result>
    <data>
        <name>张三</name>
        <age>20</age>
    </data>
</response>

通过以上的配置,转换后的JSON对象中不会存在sex节点,而不会出现空中括号。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:解决使用json-lib包实现xml转json时空值被转为空中括号的问题 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • Java Apache Commons报错“TransformerFactoryConfigurationError”的原因与解决方法

    “TransformerException”是Java的ApacheCommons类库中的一个异常,通常由以下原因之一引起: XML格式错误:如果XML格式不正确,则可能会出现此异常。例如,可能会缺少必需的元素或属性。 XSLT格式错误:如果XSLT格式不正确,则可能会出现此异常。例如,可能会使用错误的XSLT模板或模板配置错误。 以下是两个实例: 例1 如…

    Java 2023年5月5日
    00
  • SpringSecurity注销设置的方法

    下面是关于SpringSecurity注销设置的方法的完整攻略: 1. 设置注销页面 首先,我们需要在SpringSecurity配置中指定注销页面的URL。我们可以在XML配置文件中加入以下配置: <http> <!–省略其他配置–> <logout logout-url="/logout" logou…

    Java 2023年5月20日
    00
  • solaris 10下安装java+tomcat

    下面是“solaris 10下安装java+tomcat”的完整攻略: 安装Java 下载并解压Java安装包,建议使用JDK 8及以上版本。 bash $ cd /usr/local $ wget https://download.oracle.com/java/8u201-b09/42970487e3af4f5aa5bca3f542482c60/serv…

    Java 2023年5月24日
    00
  • Java创建与结束线程代码示例

    创建线程是使用Java多线程的基本步骤之一,可以使用线程类或者实现Runnable接口的线程对象。结束线程可以使用stop方法,但因为此方法可能会导致不可预知的结果而被废弃,因此推荐使用条件退出方式停止线程。 以下是Java创建与结束线程的完整攻略: 创建线程 使用线程类 继承Thread类并实现run方法,run方法中包含当前线程的操作逻辑。然后创建线程对…

    Java 2023年5月18日
    00
  • Java面向对象之抽象类,接口的那些事

    Java面向对象之抽象类与接口 什么是抽象类? 抽象类是一种特殊的类,它不能被实例化,只能被继承。 定义抽象类 抽象类的定义方式为,在class前加上abstract关键字。 下面是一个定义抽象类的示例代码: abstract class Animal { public abstract void move(); } 其中,Animal是一个抽象类,而mov…

    Java 2023年5月26日
    00
  • 使用Apache Camel表达REST服务的方法

    使用Apache Camel表达REST服务的方法主要可以分为三步: 编写REST服务逻辑代码; 将REST服务逻辑代码嵌入到Camel路由器中; 配置Camel路由器以将REST服务暴露给客户端。 下面详细介绍这三步的具体实现方法。 第一步:编写REST服务逻辑代码 对于每个REST服务,你需要编写处理请求的逻辑代码。这些代码通常使用Java编写,并且基于…

    Java 2023年5月19日
    00
  • SpringBoot多数据库连接(mysql+oracle)的实现

    下面就是“SpringBoot多数据库连接(mysql+oracle)的实现”的完整攻略。 一、依赖引入 首先在pom.xml中引入mysql和oracle的jdbc依赖,以及SpringBoot的相关依赖: <dependencies> <!– mysql jdbc –> <dependency> <group…

    Java 2023年5月20日
    00
  • 浅谈java定时器的发展历程

    浅谈Java定时器的发展历程 什么是定时器 定时器是一种在预设时间内周期性地执行任务的机制,通常用于定期执行一些任务,或者实现某些重复性的操作。在Java中,定时器一般是基于Timer类和ScheduledExecutorService实现的。 Java定时器的发展历程 Timer 在Java最早的版本中,Timer是实现定时器功能的主要类。它可以通过sch…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部