首页 > 其他分享 >第十九篇 JSON 、XML、E4X

第十九篇 JSON 、XML、E4X

时间:2023-04-05 22:56:12浏览次数:40  
标签:XML obj name 对象 E4X JavaScript JSON

by caix in 深圳

JSON

定义

JSON:JavaScript Object Notation 【JavaScript 对象表示法】

JSON(JavaScript Object Notation,JS 对象标记)是一种轻量级的数据交换格式,目前使用特别广泛。

JSON 是存储和交换文本信息的语法。类似 XML。

JSON 采用完全独立于任何程序语言的文本格式,使JSON成为理想的数据交换语言

JSON 易于人阅读和编写,同时也易于机器解析和生成,并有效的提供网络传输效率。

JSON 是 JavaScript Object Notation 的缩写,实际上是一个按照一定格式进行编码的简单 JavaScript 对象的字符串表示,它只有非常少的语法,语法结构非常简单。而因为 JSON 字符串的语法简单,所以它所包含的数据类型也非常的少,但是对于大部分场景来说,这足够了。

JavaScript语言中,一切都是对象。因此,任何JavaScript支持的类型都可以通过JSON来表示,例如字符串、数字、对象、数组等
为什么使用 JSON

提到JSON,我们就应该和XML来进行对比。XML也是一种存储和交换文本信息的手段。那么JSON好在哪里呢?

JSON 比 XML 更小、更快,更易解析

javaScript原生支持JSON,解析速度会很快

XML解析成DOM对象的时候,浏览器【IE和fireFox】会有差异

使用JSON会更简单

更加容易创建JavaScript对象

var p = {'city':['北京','上海','广州','深圳']};
for(var i=0;i<p.city.length;i++){
    document.write(p.city[i]+"<br/>");
}

JSON 凭借其简单的语法,在对其进行解释的时候,可以完全按照从前到后的顺序进行解释,每一个字符的语义都是根据上文而确定的,不会因为后面跟的内容不同而表现出不同的含义,因此在进行语法解析的时候,只需要一个栈结构,然后从前到后顺序解析即可,不会出现回溯的情况

并且因为 JSON 中没有函数、没有对象解构、没有变量,什么都没有,只有 {}、[]、""、, 几种确定的符号,以及 object、array、string、number、boolean、null 几种简单的数据类型,并且写法也较为简单单一,所以在解析的时候可以大大减少判断的次数

因此相比于 JavaScript 代码的解释来说,JSON 的解释就简单高效很多
 JSON 语法
 
 JavaScript语言中,一切都是对象。因此,任何JavaScript支持的类型都可以通过JSON来表示,例如字符串、数字、对象、数组等
 
 一个有效的JSON文档需要被包含在一对花括号内  { JSON-Data }
 
 1、它要求的语法格式:
 
   简单值
   
     字符串 => “123”
     数值 => 123
     布尔值 => true
     null
     
      注意:JSON 不支持 javascript 中的特殊值 undefined
     
   对象
   
     {"name": "helin",“age”: 12}
     
   数组
   
     [ {"name": "iskeeping","age": 12} ]
     
   注意:JSON的key一定要用双引号,以及value如果是字符串也一定要用双引号。 
   
 2、JSON 和 JavaScript 对象的关系:
 
 JSON 是 JavaScript 对象的字符串表示法,它使用文本表示一个 JS 对象的信息,本质是一个字符串
 
 var obj = {a:'Hello', b: 'world'}; // 这是一个对象,注意键名是可以使用引号包裹的
var json = '{"a
" : "Hello", "b": "world"}'; // 这是一个 JSON 字符串,本质是 一个字符串

 3、JSON 和 JavaScript 对象互转
 
   JSON.parse()
 
   实现从 JSON 字符串转换为 JavaScript 对象
   
   var obj = JSON.parse('{"a": "Hello", "b": "World"}')
=> 结果是 {a: 'Hello', b: 'world'}

    补充  使用 eval 和 使用 Function
    
       eval("({\"name\":\"iskeeping\"})")
       
       new Function("", "return ({\"name\":\"iskeeping\"})")()

   JSON.stringify()
   
   实现 JavaScript 对象转换为 JSON 字符串
   
   var json = JSON.stringify({a: 'Hello', b: 'World'})
=> 结果是 '{"a": "Hello", "b": "World}'
序列化选项

JSON.stringify() 除了要序列化的对象外,还可以接受另外两个参数,这两个参数用于指定以下不同的方式序列化 javascript 对象

JSON.stringify() 方法可以通过参数控制输出的数据和格式,灵活应用它会大大提高我们的工作效率

1、过滤结果

const data = [
    {
        name: "person1",
        sex: 0,
        age: 18,
        isStudent: true
    },
    {
        name: "person2",
        sex: 1,
        age: 25,
        isStudent: false
    },
    {
        name: "person3",
        sex: 0,
        age: 15,
        isStudent: true
    }
]

只输出姓名和性别

const res = JSON.stringify(data, ["name", "sex"])
console.log(res);
// `[{"name":"person1","sex":0},{"name":"person2","sex":1},{"name":"person3","sex":0}]`

将性别转为中文字符

const res = JSON.stringify(data, (key, value) => {
    if (key == 'sex') {
        return ["女", '男'][value];
    }
    return value;
})
console.log(res);
// `[{"name":"person1","sex":"女","age":18,"isStudent":true},{"name":"person2","sex":"男","age":25,"isStudent":false},{"name":"person3","sex":"女","age":15,"isStudent":true}]`

2、字符串缩进

space 参数

const res = JSON.stringify(data, ["name", "sex"],4)
console.log(res);

这里使用了 4 个空格做为层级缩进

注意:使用 “\t” 得到的结果和使用 4 个空格得到的结果看起来很像,但实际不是一回事
JSON.parse(JSON.stringify(obj))深拷贝的问题

1、如果obj里面存在时间对象,JSON.parse(JSON.stringify(obj))之后,时间对象变成了字符串。
2、如果obj里有RegExp、Error对象,则序列化的结果将只得到空对象。
3、如果obj里有函数,undefined,则序列化的结果会把函数, undefined丢失。
4、如果obj里有NaN、Infinity和-Infinity,则序列化的结果会变成null。
5、JSON.stringify()只能序列化对象的可枚举的自有属性。如果obj中的对象是有构造函数生成的, 则使用JSON.parse(JSON.stringify(obj))深拷贝后,会丢弃对象的constructor。
6、如果对象中存在循环引用的情况也无法正确实现深拷贝。

递归实现深拷贝

function copy (obj) {
    let newObj = null
    if (typeof obj === 'object' && obj !== null) {
    	newObj = obj instanceof Array ? [] : {}
        for (let i in obj) {
        	newObj[i] = typeof obj[i] === 'object' ? copy(obj[i]) : obj[i]
        }
    } else {
    	newObj = obj
    }
    return newObj
}

XML

扩展标记语言 (Extensible Markup Language, XML)

XML一度是互联网上存储和传输结构化数据的标准。DOM标准不仅是为了在浏览器中使用,而且还为了在桌面和服务器应用程序中处理XML数据结构,在没有DOM标准时,开发者常使用js编写自己的XML解析器

服务器端和客户端不同浏览器都需要花费大量代码来解析XML,客户端不同浏览器之间解析XML的方式不一致

浏览器对使用js处理XML实现及相关技术提供支持 :

DOMParser类型时简单的对象,可以将XML字符串解析为DOM文档
XMLSerializer类型将DOM文档解析为XML字符串
知识点

1、什么是 XML

XML 指可扩展标记语言(EXtensible Markup Language)
XML 是一种标记语言,很类似 HTML
XML 的设计宗旨是传输数据,而非显示数据
XML 标签没有被预定义。需要我们自行定义标签。
XML 被设计为具有自我描述性
XML 是 W3C 的推荐标准

2、XML 的主要作用
用来保存数据,而且这些数据具有自我描述性
它还可以做为项目或者模块的配置文件
还可以做为网络传输数据的格式(现在 JSON 为主)

3、XML 与 HTML

XML 不是 HTML 的替代。
XML 和 HTML 为不同的目的而设计:
XML 被设计为传输和存储数据,其焦点是数据的内容。
HTML 被设计用来显示数据,其焦点是数据的外观。
HTML 旨在显示信息,而 XML 旨在传输信息。
XML 标签对大小写敏感,而HTML标签对大小写不敏感,浏览器在解析HTML标签时会自动把其标签名转化为小写。

4、XML 属性
xml 的标签属性和 html 的标签属性是非常类似的,属性可以提供元素的额外信息 标签上可以书写属性: 一个标签上可以书写多个属性。每个属性的值必须使用 引号 引起来。

5、XML语法规则

所有 XML 元素都须有关闭标签(也就是闭合)
XML 标签对大小写敏感
XML 必须正确地嵌套
XML 文档必须有根元素
根元素就是顶级元素, 没有父标签的元素,叫顶级元素。
根元素是没有父标签的顶级元素,而且是唯一一个才行。
XML 的属性值须加引号
XML 中的特殊字符
<?xml version="1.0" encoding="UTF-8"?>
<!-- xml 声明 version 是版本的意思 encoding 是编码 -->
<students>
    <student id="001">
        <name>Mr.Yu</name>
        <age>21</age>
        <gender><![CDATA[<男>]]></gender>
    </student>

    <student id="002">
        <name>小明</name>
        <age>20</age>
        <gender><![CDATA[<男>]]></gender>
    </student>
</students>

E4X

E4X(ECMAScript for XML)是一种在ECMAScript(见ECMA-262,包括ActionScript、JavaScript等语言实现)标准的基础上加入的动态XML支持的程序语言扩展

E4X已被遗弃。在Firefox 17默认网页中已被禁用,Firefox 20浏览器默认禁用,并已在Firefox 21删除。官方推荐使用DOMParser / XMLSerializer或非jxon算法代替

标签:XML,obj,name,对象,E4X,JavaScript,JSON
From: https://www.cnblogs.com/caix-1987/p/17291219.html

相关文章

  • 方法定义,Date和JSON对象,及JavaScript式面向对象编程
    一.方法1.方法的定义 方法就是把函数放在对象里面,对象有两个东西:属性和方法通过对象名.方法名()使用a.第一种方法定义<script>varsetFun={name:"maming",birth:2002,//方法:被包含在对象之中age:function(){varnow=ne......
  • Spring 源码解析 - xml解析封装BeanDefinition(1)
    -  XML解析封装BeanDefinition  断点在 DefaultListableBeanFacy,registerBeanDefinition()二 如果给属性赋值 三 各种postprocessor       ##2、Spring套路点-1、AbstractBeanDefinition看看何时给容器中注入了什么组件-2、BeanFactory让......
  • 关于python中使用json.loads()将字符串数据转换成字典
    在json模块中,我们可以经常会用到load()与loads(),其中两者的区别如下json.load()从json文件中读取数据转抱为dict类型json.loads()将str类型的数据转换为dict类型这里笔者主要说明json.loads()的用法,将字符串转转换成字典,如下str2dict.py脚本内容:importjsonJsonStr='''{......
  • 关于python中使用json.load()从json文件中读取数据转换成字典
    在json模块中,我们可以经常会用到load()与loads(),其中两者的区别如下json.load()从json文件中读取数据转抱为dict类型json.loads()将str类型的数据转换为dict类型这里笔者主要说明json.load()的用法,举例说明,如下有一json文件,ip-ranges.json,内容如下:这里我们将使用json.load(......
  • Python爬虫 execjs执行js报错json.decoder.JSONDecodeError: Expecting value: line 1
    fun=re.search(r'(__=\([\S\s]*?;)<',r_text).group(1)fun=fun+'functionget(){returnJSON.stringify(__.data)}'ctx=execjs.compile(fun)rdata=(ctx.eval('get()'))报错json.decoder.JSONDecodeError:Expectingvalue:line1col......
  • 简单的CMakePresets.json解析 -- configurePresets
    ----CMake官方文档-----CMakeLists.txt是通用的c++项目管理文件,在不同的设备中,环境变量,编译器等都可能不同,将这些设置都交给CMakeLists.txt,并不是一个好办法。为了降低CMakeLists.txt的臃肿程度,简化其判断,可以针对不同设备,配置不同的CMakePresets.json.使得项目可以在......
  • JsonCpp JSON格式处理库的介绍和使用(面向业务编程-文件格式处理)
    JsonCppJSON格式处理库的介绍和使用(面向业务编程-文件格式处理)介绍JSON是一种轻量级的数据交换格式,它是一种键值对的集合。它的值可以是数字、字符串、布尔值、序列。想知道更多有关JSON格式的介绍,可以到JSON的官网json.org学习JsonCpp是一个c++库,允许对JSON值进行操作,包括......
  • swift tabview 带参数请求网络。多条目展示。json解析,逃逸闭包
    效果:用到的第三方#Uncommentthenextlinetodefineaglobalplatformforyourprojectplatform:ios,'9.0'target'News'do#Commentthenextlineifyoudon'twanttousedynamicframeworksuse_frameworks!#PodsforNewsp......
  • 解决Mixed Content: The page at https://* was loaded over HTTPS, but requested an
    问题:前端页面调用后端接口加载不出来 原因分析:通过查看浏览器调试console日志,得到报错如下 原文:MixedContent:Thepageathttps://*wasloadedoverHTTPS,butrequestedaninsecureXMLHttpRequestendpointhttp://*.Thisrequesthasbeenblocked;thecont......
  • Springboot JSON整合—官方原版
    SpringBoot提供与三个JSON映射库的集成:GsonJacksonJSON-BJackson是首选和默认库。一、Jackson提供了Jackson的自动配置,Jackson是springbootstarterjson的一部分。当Jackson在类路径上时,会自动配置一个ObjectMapperbean。提供了几个配置财产,用于自定义ObjectMapper的配置。1.......