xml转json

news2024/11/26 13:32:09

XML有个坑,就是XML转JSON中如何把单个元素转成数组,导致映射到实体类时无法执行,问题如下

初始xml格式如下:

<java>
    <version>1.8</version>
</java>

上述转成json格式就是:

{
  "java": {
    "version": "1.8"
  }
}

但是java不止一个版本,我们需要的格式就如下:

{
  "java": {
    "version": [
      "1.8",
      "11"
    ]
  }
}

如果我们要做到上诉json所示,需要xml格式为如下,但是有时候数据就只有单个的情况下,我们格式转换就有问题

<java>
    <version>1.8</version>
    <version>11</version>
</java>

问题:就是我们不知道xml中的元素是单个元素还是一个数组形式存在的

解决办法:

1、引入maven依赖

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.71</version>
        </dependency>
        <!--xml转JSON-->
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
            <version>20230618</version>
        </dependency>

2、使用我的工具类:

package com.example.test.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.json.XML;
import org.json.XMLParserConfiguration;

import java.util.Set;

/**
 * xml格式转换工具
 * @author ZPA
 * @Date 2023年8月31日09:47:16
 */
public class XmlUtils {

    /**
     * xml 转为 实体类
     * @param xml xml的数据,为String类型
     * @param clazz 实体类的class
     * @return T
     * @param <T>
     */
    public static <T> T xmlToBean(String xml,Class<T> clazz){
        return xmlToJson(xml).toJavaObject(clazz);
    }

    /**
     * xml 转为 实体类 (指定节点强制转数组)
     * @param xml xml的数据,为String类型
     * @param clazz 实体类的class
     * @return T
     * @param <T>
     */
    public static <T> T xmlToBean(String xml, Set<String> arrayNodes,Class<T> clazz){
        return xmlToJson(xml,arrayNodes).toJavaObject(clazz);
    }

    /**
     * xml 字符串转 json
     * @param xml
     * @return
     */
    public static JSONObject xmlToJson(String xml){
        String s = XML.toJSONObject(xml).toString();
        return JSON.parseObject(s, JSONObject.class);
    }


    /**
     * 指定节点强制转数组
     * @param xml
     * @param arrayNodes
     * @return
     */
    public static JSONObject xmlToJson(String xml, Set<String> arrayNodes) {
        XMLParserConfiguration config = XMLParserConfiguration.KEEP_STRINGS;
        // 设置withForceList配置强制数组标签名

        if (arrayNodes != null && arrayNodes.size() > 0) {
            config = config.withForceList(arrayNodes);
        }
        return JSON.parseObject(XML.toJSONObject(xml, config).toString());
    }

}

3、测试

    @Test
    public void test(){
        String xml = "<java>\n" +
                "    <version>1.8</version>\n" +
                "</java>";
        // 把version转换为数组
        HashSet<String> set = Sets.newHashSet();
        set.add("version");
        JSONObject haveListJson = XmlUtils.xmlToJson(xml, set);
        System.out.println(haveListJson);
        // 转成普通的json
        JSONObject json = XmlUtils.xmlToJson(xml);
    }

可以看见的确吧version转成了集合

在这里插入图片描述

依赖报错解决方法:java.lang.NoSuchMethodError: org.json.JSONTokener.<init>(Ljava/io/Reader;)V

就我而言,这是因为依赖项“spring-boot-starter-test”依赖于“android-json”。排除后,它起作用了:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <groupId>com.vaadin.external.google</groupId>
            <artifactId>android-json</artifactId>
        </exclusion>
    </exclusions>
</dependency>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/952956.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习记录——Efficient MOdel轻量化主干模型(iRMB、EMO)

Rethinking Mobile Block for Efficient Attention-based Models 结合 CNN 和 Transformer 的倒残差移动模块设计 ICCV-2023 实例化了一个面向移动端应用的iRMB基础模块&#xff08;Inverted Residual Mobile Block&#xff0c;倒残差移动模块&#xff09;&#xff0c;其同时具…

UI自动化面试题合集

1、什么是UI自动化测试&#xff1f; UI自动化测试是一种通过模拟用户交互并自动执行UI操作的软件测试方法。它用于验证用户界面的功能和稳定性&#xff0c;以确保在不同的操作系统、浏览器和设备上的一致性。 同时&#xff0c;在这我也准备了一份软件测试面试视频教程&#x…

怎么消除人声保留背景音乐?试试这几种简单方法

消除人声保留背景音乐可以用于许多不同的目的。例如&#xff0c;可以在视频制作中使用&#xff0c;以确保观众能够听到清晰的对话&#xff0c;而不会被其他噪音干扰。此外&#xff0c;它也可以用于音乐制作中&#xff0c;以便更好地混合和控制音频元素。教大家几种简单的提取方…

白鲸开源 DataOps 平台加速数据分析和大模型构建

作者 | 李晨 编辑 | Debra Chen 数据准备对于推动有效的自助式分析和数据科学实践至关重要。如今&#xff0c;企业大都知道基于数据的决策是成功数字化转型的关键&#xff0c;但要做出有效的决策&#xff0c;只有可信的数据才能提供帮助&#xff0c;随着数据量和数据源的多样…

【大虾送书第七期】深入浅出SSD:固态存储核心技术、原理与实战

目录 ✨写在前面 ✨内容简介 ✨作者简介 ✨名人推荐 ✨文末福利 &#x1f990;博客主页&#xff1a;大虾好吃吗的博客 &#x1f990;专栏地址&#xff1a;免费送书活动专栏地址 写在前面 近年来国家大力支持半导体行业&#xff0c;鼓励自主创新&#xff0c;中国SSD技术和产业…

Java Stream与多线程

Java Stream 1. 问题引入 学习了尚硅谷的JUC&#xff0c;周阳老师讲的商城比较价格的案例&#xff0c;自己模拟了一个多线程的demo, 多线程处理任务并且汇总结果&#xff0c;出现了疑问&#xff0c;实例代码放在下面&#xff0c;读者有兴趣的话可ctrlcv玩一玩 如下是自定义的任…

BEV感知算法的概念

本文来自自动驾驶之心知识星球的国内首个BEV感知全栈系列学习教程 什么是BEV&#xff1f; ----> 上帝视角 Bird’s-Eye-View&#xff0c;鸟瞰图&#xff08;俯视图&#xff09;尺度变化小 &#xff08;离相机远的尺度比较小&#xff0c;离相机近的尺度比较大&#xff0c;比…

RT_Thread内核机制学习(四)队列

队列 队列中每个消息块都有一个头部&#xff0c;指向下一个消息块。 消息块的内存是连在一起的&#xff0c;但是是用链表组织的。 struct rt_messagequeue {struct rt_ipc_object parent; /**< inherit from ipc_object */void *m…

《独立开发者首次飞行指南》终于来了!!

大家好&#xff0c;我是彭涛。 现在&#xff0c;每年都有各家大厂裁员&#xff0c;各类中小厂跑路&#xff0c;失业人数越来越多的新闻。如果&#xff0c;我们身背房贷&#xff0c;我们应该都会非常焦虑。大环境下&#xff0c;我们不得不逐一探索新的赚钱之道&#xff0c;前段时…

anaconda环境迁移

conda环境迁移第一步 进入anaconda安装文件夹&#xff0c;然后进入envs文件夹&#xff0c;下面的每一个文件夹都是你创建的环境&#xff0c; 准备一个u盘之类的&#xff0c;把整个文件夹复制下来&#xff0c;然后打开另外一台机器&#xff0c;把同样的文件夹复制到同样的文件夹…

JS设置视频播放速度

方法 一&#xff1a;示例代码 document.querySelector(video).playbackRate 5; 进入到要加速的视频页面按F12打开控制控制台输入代码并回车 方法二&#xff1a;示例代码 document.getElementsByTagName("video")[0].playbackRate 5; 进入到要加速的视频页面按F…

钉钉消息已读、未读咋实现的嘞?

前言 一款app&#xff0c;消息页面有&#xff1a;钱包通知、最近访客等各种通知类别&#xff0c;每个类别可能有新的通知消息&#xff0c;实现已读、未读功能&#xff0c;包括多少个未读&#xff0c;这个是怎么实现的呢&#xff1f;比如用户A访问了用户B的主页&#xff0c;难道…

Java实现获取微信小程序scheme码报错

如标题所见&#xff0c;使用Java获取小程序scheme时除了出现文档中的常见错误&#xff0c;我将我调试的时候遇到的错误和解决方式分享出来方便大家少花一部分时间解决该问题。&#xff08;往下划有结论节省时间&#xff09;。 获取scheme码之前需要先获取access_token&#xff…

Vue生命周期(详细)

生命周期 图&#xff1a; 可以理解vue生命周期就是指vue实例从创建到销毁的过程&#xff0c;在vue中分为8个阶段&#xff1a;创建前/后&#xff0c;载入前/后&#xff0c;更新前/后&#xff0c;销毁前/后。 一、创建&#xff08;实例&#xff09; 1、beforeCreate&#xff1a…

问道管理:市盈率怎么计算?

市盈率是衡量一家公司股票价格是否合理的重要目标之一&#xff0c;核算市盈率的公式是将一家公司的股票价格除以每股收益&#xff0c;也便是市盈率 股票价格 每股收益。市盈率能够告诉你一个公司的股票价格是否高估或轻视&#xff0c;是投资者在买入或卖出一家公司股票时需求…

拒绝摆烂!C语言练习打卡第七天

&#x1f525;博客主页&#xff1a;小王又困了 &#x1f4da;系列专栏&#xff1a;每日一练 &#x1f31f;人之为学&#xff0c;不日近则日退 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 目录 一、选择题 &#x1f4dd;1.第一题 &#x1f4dd;2.第二题 &#x1f4d…

UE5.1 透明渲染流程框架图

相关文章&#xff1a; UE 透明物体绘制准备_sh15285118586的博客-CSDN博客 透明直接光和间接光生成_sh15285118586的博客-CSDN博客 Scene:Translucency-Translucency(AfterDOF)_sh15285118586的博客-CSDN博客 Scene:Translucency-Distortion &PostProcessing:ComposeTran…

系列十四、Chrome浏览器安装JSONView插件

一、下载JSONView插件 说明&#xff1a;如果能够上外网的话&#xff0c;在Chrome应用商店下载JSON格式化插件安装即可 我分享的链接&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1H8VUH8e9Tw7JqrlJEBnQQg?pwdyyds 提取码&#xff1a;yyds 二、安装 解压》Chrome…

MybatisPlus-Generator

文章目录 一、前言二、MybatisPlus代码生成器1、引入依赖2、编写生成代码3、配置说明3.1、全局配置(GlobalConfig)3.2、包配置(PackageConfig)3.3、模板配置(TemplateConfig)3.4、策略配置(StrategyConfig)3.4.1、Entity 策略配置3.4.2、Controller 策略配置3.4.3、Service 策略…

IDEA快速设置全局JDK

出bug 了 JDK 不识别了&#xff0c;才想起来要设置jdk &#xff0c;现在一般查到的都是setting 设置全局的idea设置。但是老玩家的我怎么会不知道有一个设置全局jdk 的一个设置 setings 设置是对idea 的基础设置。 但是还有一个隐藏页面快捷键【CtrlAltShiftS】 接下来自己研究…