详细介绍XML与JSON相互转换(图文)

JOSN简介

在本系列的第一篇已经简单比较了xmljson 时光机

JSON:JavaScript 对象表示法(JavaScript Object Notation)。 JSON 是存储和交换文本信息的语法。类似 XML。 JSON 比 XML 更小、更快,更易解析。

什么是 JSON?

JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据交换格式 JSON 独立于语言 * JSON 具有自我描述性,更易理解

JSON 使用 JavaScript 语法来描述数据对象,但是 JSON 仍然独立于语言和平台。JSON 解析器和 JSON 库支持许多不同的编程语言。

JSON格式化

尽管有许多宣传关于 XML 如何拥有跨平台,跨语言的优势,然而,除非应用于 Web Services,否则,在普通的 Web 应用中,开发者经常为 XML 的解析伤透了脑筋,无论是服务器端生成或处理 XML,还是客户端用 JavaScript 解析 XML,都常常导致复杂的代码,极低的开发效率。实际上,对于大多数 Web 应用来说,他们根本不需要复杂的 XML 来传输数据,XML 的扩展性很少具有优势,许多 AJAX 应用甚至直接返回 HTML 片段来构建动态 Web 页面。和返回 XML 并解析它相比,返回 HTML 片段大大降低了系统的复杂性,但同时缺少了一定的灵活性

XML2JOSN

借助第三方类库转换 

1256.png

使用NuGet添加第三方类库

1255.png

string xml = @"Alanhttp://www.google.comLouishttp://www.yahoo.com"; XmlDocument doc = new XmlDocument();doc.LoadXml(xml); string jsonText = JsonConvert.SerializeXmlNode(doc);//{//  "?xml": {//    "@version": "1.0",//    "@standalone": "no"//  },//  "root": {//    "person": [//      {//        "@id": "1",//        "name": "Alan",//        "url": "http://www.google.com"//      },//      {//        "@id": "2",//        "name": "Louis",//        "url": "http://www.yahoo.com"//      }//    ]//  }//}

1257.png

对于每个表标签的属性对应JSON中的”@”标签名
如果有多个同名标签就会添加到一个数组集合中

其他方式转换

1.使用.NET Framework中的JavaScriptSerializer类

首先需要确保你的工程或服务器支持.NET 4.0或以上版本的Framework,否则无法找到该类。
通过JavaScriptSerializer来实现。它的名字空间为:System.Web.Script.Serialization
如果要使用它,还须添加
System.Web.Extensions库文件引用

  var xml =                   @"          True          Hello World          999        ";            var dic = XDocument                .Parse(xml)                .Descendants("Column")                .ToDictionary(                    c => c.Attribute("Name").Value,                    c => c.Value                );            var json = new JavaScriptSerializer().Serialize(dic);            Console.WriteLine(json);

1258.png

2.手动编写转换类

  public class Xml2JSON    {        public static string XmlToJSON(XmlDocument xmlDoc)        {            StringBuilder sbJSON = new StringBuilder();            sbJSON.Append("{ ");            XmlToJSONnode(sbJSON, xmlDoc.DocumentElement, true);            sbJSON.Append("}");            return sbJSON.ToString();        }         //  XmlToJSONnode:  Output an XmlElement, possibly as part of a higher array        private static void XmlToJSONnode(StringBuilder sbJSON, XmlElement node, bool showNodeName)        {            if (showNodeName)                sbJSON.Append(""" + SafeJSON(node.Name) + "": ");            sbJSON.Append("{");            // Build a sorted list of key-value pairs            //  where   key is case-sensitive nodeName            //          value is an ArrayList of string or XmlElement            //  so that we know whether the nodeName is an array or not.            SortedList childNodeNames = new SortedList();             //  Add in all node attributes            if (node.Attributes != null)                foreach (XmlAttribute attr in node.Attributes)                    StoreChildNode(childNodeNames, attr.Name, attr.InnerText);             //  Add in all nodes            foreach (XmlNode cnode in node.ChildNodes)            {                if (cnode is XmlText)                    StoreChildNode(childNodeNames, "value", cnode.InnerText);                else if (cnode is XmlElement)                    StoreChildNode(childNodeNames, cnode.Name, cnode);            }             // Now output all stored info            foreach (string childname in childNodeNames.Keys)            {                ArrayList alChild = (ArrayList)childNodeNames[childname];                if (alChild.Count == 1)                    OutputNode(childname, alChild[0], sbJSON, true);                else                {                    sbJSON.Append(" "" + SafeJSON(childname) + "": [ ");                    foreach (object Child in alChild)                        OutputNode(childname, Child, sbJSON, false);                    sbJSON.Remove(sbJSON.Length - 2, 2);                    sbJSON.Append(" ], ");                }            }            sbJSON.Remove(sbJSON.Length - 2, 2);            sbJSON.Append(" }");        }         //  StoreChildNode: Store data associated with each nodeName        //                  so that we know whether the nodeName is an array or not.        private static void StoreChildNode(SortedList childNodeNames, string nodeName, object nodeValue)        {            // Pre-process contraction of XmlElement-s            if (nodeValue is XmlElement)            {                // Convert   into "aa":null                //          xx into "aa":"xx"                XmlNode cnode = (XmlNode)nodeValue;                if (cnode.Attributes.Count == 0)                {                    XmlNodeList children = cnode.ChildNodes;                    if (children.Count == 0)                        nodeValue = null;                    else if (children.Count == 1 && (children[0] is XmlText))                        nodeValue = ((XmlText)(children[0])).InnerText;                }            }            // Add nodeValue to ArrayList associated with each nodeName            // If nodeName doesn't exist then add it            object oValuesAL = childNodeNames[nodeName];            ArrayList ValuesAL;            if (oValuesAL == null)            {                ValuesAL = new ArrayList();                childNodeNames[nodeName] = ValuesAL;            }            else                ValuesAL = (ArrayList)oValuesAL;            ValuesAL.Add(nodeValue);        }         private static void OutputNode(string childname, object alChild, StringBuilder sbJSON, bool showNodeName)        {            if (alChild == null)            {                if (showNodeName)                    sbJSON.Append(""" + SafeJSON(childname) + "": ");                sbJSON.Append("null");            }            else if (alChild is string)            {                if (showNodeName)                    sbJSON.Append(""" + SafeJSON(childname) + "": ");                string sChild = (string)alChild;                sChild = sChild.Trim();                sbJSON.Append(""" + SafeJSON(sChild) + """);            }            else                XmlToJSONnode(sbJSON, (XmlElement)alChild, showNodeName);            sbJSON.Append(", ");        }         // Make a string safe for JSON        private static string SafeJSON(string sIn)        {            StringBuilder sbOut = new StringBuilder(sIn.Length);            foreach (char ch in sIn)            {                if (Char.IsControl(ch) || ch == ''')                {                    int ich = (int)ch;                    sbOut.Append(@"u" + ich.ToString("x4"));                    continue;                }                else if (ch == '"' || ch == '' || ch == '/')                {                    sbOut.Append('');                }                sbOut.Append(ch);            }            return sbOut.ToString();        }    }

1259.png

JOSN2XML

借助第三方类库转换

1260.png

string json = @"{   '?xml': {     '@version': '1.0',     '@standalone': 'no'   },   'root': {     'person': [       {         '@id': '1',        'name': 'Alan',        'url': 'http://www.google.com'      },      {        '@id': '2',        'name': 'Louis',        'url': 'http://www.yahoo.com'      }    ]  }}"; XmlDocument doc = JsonConvert.DeserializeXmlNode(json);doc.Save(@"D:json.xml");// // //   //     Alan//     http://www.google.com//   //   //     Louis//     http://www.yahoo.com//   // 

其他方式转换

1261.png

以上就是详细介绍XML与JSON相互转换(图文)的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1428964.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 01:49:09
使用CSS样式表格式化XML文档的详情介绍
下一篇 2025年12月17日 01:50:48

相关推荐

  • 修复Django电商项目中AJAX过滤产品列表图片不显示问题

    在Django电商项目中,当使用AJAX动态加载过滤后的产品列表时,常遇到图片无法正常显示的问题。这通常是由于前端模板中图片加载方式(如data-setbg属性结合JavaScript库)与AJAX动态内容更新机制不兼容所致。解决方案是直接在AJAX返回的HTML中使用标准的标签来渲染图片,确保浏览…

    2026年5月10日
    000
  • Golang JSON序列化:控制敏感字段暴露的最佳实践

    本教程探讨golang中如何高效控制结构体字段在json序列化时的可见性。当需要将包含敏感信息的结构体数组转换为json响应时,通过利用`encoding/json`包提供的结构体标签,特别是`json:”-“`,可以轻松实现对特定字段的忽略,从而避免敏感数据泄露,确保api…

    2026年5月10日
    000
  • JavaScript函数中插入加载动画(Spinner)的正确方法

    本文旨在解决在JavaScript函数中插入加载动画(Spinner)时遇到的异步问题。通过引入async/await和Promise.all,确保在数据处理完成前后正确显示和隐藏加载动画,提升用户体验。我们将提供两种实现方案,并详细解释其原理和优势。 在Web开发中,当执行耗时操作时,显示加载动画…

    2026年5月10日
    100
  • Golang空接口如何应用在项目中

    空接口可用于接收任意类型值,常见于日志函数、通用数据结构、JSON动态解析及配置驱动逻辑,提升代码灵活性,但需配合类型断言确保安全,避免滥用以降低维护成本。 空接口 interface{} 在 Go 语言中是一个非常灵活的类型,它可以存储任何类型的值。虽然它牺牲了一部分类型安全,但在实际项目中合理使…

    2026年5月10日
    100
  • Golang使用Protobuf定义接口与消息格式

    Protobuf通过字段编号实现兼容性,新增字段可忽略、删除字段可保留编号,确保新旧版本互操作,支持服务独立演进。 在Golang项目中,利用Protobuf定义接口和消息格式,本质上是为服务间通信构建了一套高效、类型安全且跨语言的契约。它让数据结构清晰可见,RPC调用标准化,极大地简化了分布式系统…

    2026年5月10日
    000
  • Go语言接口与切片:如何识别和操作[]interface{}

    本文将深入探讨Go语言中如何识别和操作`[]interface{}`类型的切片。我们将介绍类型断言(Type Assertion)的关键作用,并通过`switch`语句演示如何安全地检测`[]interface{}`类型,并进而遍历其内部元素。文章旨在提供清晰的示例代码和专业指导,帮助开发者有效地处…

    2026年5月10日
    000
  • 从 JavaScript 获取 URL 并在 PHP DataGrid 中使用

    本文档旨在指导开发者如何从 JavaScript 函数中获取 URL,并将其动态应用于 PHP DataGrid。通过前端 JavaScript 动态生成 API 地址,并将其传递给后端的 PHP DataGrid,实现数据根据用户会话动态加载。 动态配置 DataGrid 的 URL 在构建动态 …

    2026年5月10日
    100
  • GolangWeb项目异常捕获与日志记录

    答案:通过中间件使用defer和recover捕获panic,结合zap等结构化日志库记录请求链路信息,为每个请求生成trace ID,实现异常捕获与可追踪日志,提升系统稳定性与可观测性。 在Go语言Web项目中,异常捕获与日志记录是保障系统稳定性和可维护性的关键环节。Go本身没有像其他语言那样的t…

    2026年5月10日
    000
  • JavaScript Electron桌面应用

    答案:使用JavaScript开发%ignore_a_1%桌面应用需结合Web技术与Node.js,通过主进程管理窗口、渲染进程展示界面,并利用IPC通信,调用系统功能如文件对话框,最后用electron-builder打包发布,注意安全与进程职责分离。 用JavaScript开发Electron桌…

    2026年5月10日
    000
  • Python代码如何实现定时任务 Python代码使用Schedule模块的配置

    答案:使用Python的schedule模块可实现定时任务,通过try-except处理异常确保程序不中断,结合threading实现多线程任务避免阻塞,利用JSON文件保存和加载任务配置实现持久化。 使用Python实现定时任务,主要依赖于schedule模块,它提供了一种简单易懂的方式来安排周期…

    2026年5月10日
    000
  • php代码如何操作JSON数据_php代码解析和生成JSON的方法

    答案:PHP中处理JSON需使用json_encode()和json_decode()函数。1、将数组转为JSON字符串时,用json_encode()并检查返回值是否为false;2、解析JSON字符串时,调用json_decode()并设第二参数为true返回数组,false则返回对象;3、处理…

    2026年5月10日
    000
  • JS注解怎么和TypeScript结合_ JS注解在TypeScript环境下的应用

    TypeScript 支持通过配置 allowJs 和 checkJs 在 JavaScript 文件中识别 JSDoc 注解并进行类型检查,可在混合项目中提升类型安全;常见用法包括 @type、@param、@returns 和 @typedef,能为变量、函数参数等提供类型信息,支持与 .ts …

    2026年5月10日
    000
  • Voyager 中关联关系的翻译问题解决方案

    本文档旨在解决在使用 TCGVoyager 管理后台时,关联模型无法正确翻译的问题。主要针对 Laravel 项目中,使用 Voyager 1.4 版本以及 Laravel 8.0 版本,并且已经配置多语言支持的情况下,如何确保关联关系中的可翻译字段能够根据当前应用语言环境进行正确翻译。通过修改 B…

    2026年5月10日
    000
  • Go语言与Microsoft SharePoint集成指南

    Go语言可以有效集成Microsoft SharePoint,主要通过两种途径:一是利用SharePoint提供的RESTful API进行数据交互,Go的标准HTTP客户端库即可轻松实现;二是通过SharePoint应用模型开发自托管应用,这种模型支持使用包括Go在内的任何语言编写后端逻辑。 1.…

    2026年5月10日
    000
  • 如何安全有效地从外部网页获取HTML元素数据并应用于自身页面

    本教程旨在解决如何在不同域名下,通过javascript获取并使用另一个网页的html元素数据。文章将深入探讨同源策略的限制,并提供两种主要解决方案:使用` 在现代Web开发中,有时我们需要从外部网站获取特定的HTML内容或属性值,并将其整合到我们自己的网页中。例如,从XYZ.COM/B.html页…

    2026年5月10日
    100
  • 解决PHP foreach循环中变量“继承”问题:理解与避免意外数据泄露

    本文探讨PHP foreach循环中一个常见的陷阱:当循环内部的数组或变量未被显式初始化时,其值可能会“继承”自上一次循环迭代,导致意外的数据泄露和逻辑错误。文章将深入分析这一现象的根源,并通过示例代码展示如何通过在每次迭代开始时正确初始化变量来解决此问题,确保代码行为的预期一致性。 引言:fore…

    2026年5月10日
    100
  • 如何在不暴露密钥的情况下,在客户端创建 Stripe Payment Link

    本文介绍了在纯静态网站环境下,如何利用 Stripe Payment Link 实现商品售卖,并着重讨论了在不暴露 Stripe 密钥的前提下,客户端创建 Payment Link 的可行性。分析了直接在客户端使用密钥的风险,并提出了预先生成 Payment Link 或使用后端服务动态生成 Pay…

    2026年5月10日
    000
  • ChromaDB向量嵌入的有效持久化策略

    本文详细介绍了如何利用langchain中chromadb的`persist_directory`功能,高效地持久化存储向量嵌入。通过将生成的嵌入数据保存到本地磁盘,可以有效避免重复计算,显著提升工作流程效率。教程将涵盖持久化chromadb实例的创建与后续加载的完整过程。 在处理大规模文本数据并生…

    2026年5月10日
    000
  • 解决Go语言中GOPATH未设置错误及工作区配置指南

    本文旨在解决go语言开发中常见的“gopath not set”错误,并提供详细的go工作区配置指南。内容涵盖`gopath`环境变量的设置、go项目目录结构、`path`变量的扩展,以及一些高级配置技巧,旨在帮助开发者建立一个高效、规范的go开发环境,确保包的下载、编译和运行顺利进行。 Go语言在…

    2026年5月10日
    000
  • html函数如何实现动态内容显示 html函数在网页交互中的核心应用

    JavaScript函数通过操作DOM实现动态内容更新与交互,如显示时间、实时搜索、增删元素及加载数据,使网页具备动态功能。 HTML 本身没有“函数”的概念,它是一种标记语言,用于定义网页结构。真正实现动态内容显示和交互功能的是 JavaScript。通常所说的“HTML函数”其实是 JavaSc…

    2026年5月10日
    000

发表回复

登录后才能评论
关注微信