首页 后端开发 XML/RSS教程 详细介绍XML与JSON相互转换(图文)

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

Mar 22, 2017 pm 04:43 PM

JOSN简介

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

<code>string xml = @"<?xml version=&#39;1.0&#39; standalone=&#39;no&#39;?>

<root>

<person id=&#39;1&#39;>

<name>Alan</name>

<url>http://www.google.com</url>

</person>

<person id=&#39;2&#39;>

<name>Louis</name>

<url>http://www.yahoo.com</url>

</person>

</root>";

  

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"

//      }

//    ]

//  }

//}</code>

登录后复制

1257.png

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

其他方式转换

1.使用.NET Framework中的JavaScriptSerializer类

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

<code>  var xml =

                   @"<Columns>

          <Column Name=""key1"" DataType=""Boolean"">True</Column>

          <Column Name=""key2"" DataType=""String"">Hello World</Column>

          <Column Name=""key3"" DataType=""Integer"">999</Column>

        </Columns>";

            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);</code>

登录后复制

1258.png

2.手动编写转换类

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

<code>  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  <aa></aa> into "aa":null

                //          <aa>xx</aa> 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&#39;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 == &#39;\&#39;&#39;)

                {

                    int ich = (int)ch;

                    sbOut.Append(@"\u" + ich.ToString("x4"));

                    continue;

                }

                else if (ch == &#39;\"&#39; || ch == &#39;\\&#39; || ch == &#39;/&#39;)

                {

                    sbOut.Append(&#39;\\&#39;);

                }

                sbOut.Append(ch);

            }

            return sbOut.ToString();

        }

    }</code>

登录后复制

1259.png

JOSN2XML

借助第三方类库转换

1260.png

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

<code>string json = @"{

   &#39;?xml&#39;: {

     &#39;@version&#39;: &#39;1.0&#39;,

     &#39;@standalone&#39;: &#39;no&#39;

   },

   &#39;root&#39;: {

     &#39;person&#39;: [

       {

         &#39;@id&#39;: &#39;1&#39;,

        &#39;name&#39;: &#39;Alan&#39;,

        &#39;url&#39;: &#39;http://www.google.com&#39;

      },

      {

        &#39;@id&#39;: &#39;2&#39;,

        &#39;name&#39;: &#39;Louis&#39;,

        &#39;url&#39;: &#39;http://www.yahoo.com&#39;

      }

    ]

  }

}";

  

XmlDocument doc = JsonConvert.DeserializeXmlNode(json);

doc.Save(@"D:\json.xml");

// <?xml version="1.0" standalone="no"?>

// <root>

//   <person id="1">

//     <name>Alan</name>

//     <url>http://www.google.com</url>

//   </person>

//   <person id="2">

//     <name>Louis</name>

//     <url>http://www.yahoo.com</url>

//   </person>

// </root></code>

登录后复制

其他方式转换

1261.png

以上是详细介绍XML与JSON相互转换(图文)的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

<🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系统,解释
3 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1664
14
CakePHP 教程
1423
52
Laravel 教程
1319
25
PHP教程
1269
29
C# 教程
1248
24
PHP 数组转 JSON 的性能优化技巧 PHP 数组转 JSON 的性能优化技巧 May 04, 2024 pm 06:15 PM

PHP数组转JSON的性能优化方法包括:使用JSON扩展和json_encode()函数;添加JSON_UNESCAPED_UNICODE选项以避免字符转义;使用缓冲区提高循环编码性能;缓存JSON编码结果;考虑使用第三方JSON编码库。

您如何在PHP中解析和处理HTML/XML? 您如何在PHP中解析和处理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示了如何使用PHP有效地处理XML文档。 XML(可扩展的标记语言)是一种用于人类可读性和机器解析的多功能文本标记语言。它通常用于数据存储

Jackson库中注解如何控制JSON序列化和反序列化? Jackson库中注解如何控制JSON序列化和反序列化? May 06, 2024 pm 10:09 PM

Jackson库中的注解可控制JSON序列化和反序列化:序列化:@JsonIgnore:忽略属性@JsonProperty:指定名称@JsonGetter:使用获取方法@JsonSetter:使用设置方法反序列化:@JsonIgnoreProperties:忽略属性@JsonProperty:指定名称@JsonCreator:使用构造函数@JsonDeserialize:自定义逻辑

如何使用 PHP 函数处理 XML 数据? 如何使用 PHP 函数处理 XML 数据? May 05, 2024 am 09:15 AM

使用PHPXML函数处理XML数据:解析XML数据:simplexml_load_file()和simplexml_load_string()加载XML文件或字符串。访问XML数据:利用SimpleXML对象的属性和方法获取元素名称、属性值和子元素。修改XML数据:使用addChild()和addAttribute()方法添加新元素和属性。序列化XML数据:asXML()方法将SimpleXML对象转换为XML字符串。实战案例:解析产品馈送XML,提取产品信息,转换并将其存储到数据库中。

如何使用 PHP 函数处理 JSON 数据? 如何使用 PHP 函数处理 JSON 数据? May 04, 2024 pm 03:21 PM

PHP提供了以下函数来处理JSON数据:解析JSON数据:使用json_decode()将JSON字符串转换为PHP数组。创建JSON数据:使用json_encode()将PHP数组或对象转换为JSON字符串。获取JSON数据的特定值:使用PHP数组函数访问特定值,例如键值对或数组元素。

如何在 Golang 中将 JSON 数据保存到数据库中? 如何在 Golang 中将 JSON 数据保存到数据库中? Jun 06, 2024 am 11:24 AM

可以通过使用gjson库或json.Unmarshal函数将JSON数据保存到MySQL数据库中。gjson库提供了方便的方法来解析JSON字段,而json.Unmarshal函数需要一个目标类型指针来解组JSON数据。这两种方法都需要准备SQL语句和执行插入操作来将数据持久化到数据库中。

PHP 数组转 JSON 的快捷技巧 PHP 数组转 JSON 的快捷技巧 May 03, 2024 pm 06:33 PM

PHP数组可通过json_encode()函数转换为JSON字符串(例如:$json=json_encode($array);),反之亦可用json_decode()函数从JSON转换为数组($array=json_decode($json);)。其他技巧还包括:避免深度转换、指定自定义选项以及使用第三方库。

XML 解析的 Java 库对比:寻找最佳解决方案 XML 解析的 Java 库对比:寻找最佳解决方案 Mar 09, 2024 am 09:10 AM

简介XML(可扩展标记语言)是一种用于存储和传输数据的流行格式。在Java中解析XML是许多应用程序的一个必要任务,从数据交换到文档处理。为了有效地解析XML,开发人员可以使用各种Java库。本文将比较一些最流行的XML解析库,重点关注它们的特性、功能和性能,以帮助开发人员做出明智的选择。DOM(文档对象模型)解析库JavaXMLDOMAPI:由oracle提供的标准DOM实现。它提供了一个对象模型,允许开发人员访问和操作XML文档。DocumentBuilderFactoryfactory=D

See all articles