开始之前我们先介绍一下JSON,JSON(JavaScript Object Notation,JS对象简谱)是一种轻量级的数据交换格式。它基于ECMAScript(欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。
JSON语法规则
在JS语言中,一切都是对象。因此,任何支持的类型都可以通过JSON来表示,例如字符串,数字,对象,数组等。但是对象和数组是比较特殊且常用的两种类型:
1.对象表示为键值对
2.数据由逗号分隔
3.花括号保存对象
4.方括号保存数组
JSON键/值对
JSON键值对是用来保存JS对象的一种方式,和JS对象的写法也大同小异,键/值对组合中键名写在前面并用双引号包裹,使用冒号:分隔,然后紧接着值:
{"firstName":"Json"}
JSON 与JS对象的关系
很多人搞不清楚JSON和Js对象的关系,甚至连谁是谁都不清楚。其实,可以这么理解:
JSON是JS对象的字符串表示法,它使用文本表示一个JS对象的信息,本质上是一个字符串。
如
var obj = {a:'Hello',b :'World};//这是一个对象,注意键名也是可以使用引号包裹的
var json = '{"a":"Hello","b":"World"}';//这是一个JSON字符串,本质是一个字符串
JSON和JS对象互转
要实现从JSON字符串转换为JS对象,使用JSON.parse()方法:
var obj = JSON.parse('{"a":"Hello","b":"World"}'};//结果是{a:'Hello',b:'World'}
var json = JSON.stringify({a:"Hello',b:'World'});//结果是’{"a":"Hello","b":"World"}'
常用类型
任何支持的类型都可以通过JSON来表示,例如字符串,对象,数组等,但是对象和数组是比较特殊的两种类型。
对象:对象在JS中是使用花括号包裹{}起来的内容,数据结构为{key1:value1,key2:value2,...}的键值对结构。在面向对象的语言中,key为对象的属性,value为对应的值,键名可以使用整数和字符串来表示。值得类型可以是任何类型。
数组:数组在JS中是方括号[]包裹起来的内容,数据结构为{"java","javascript","vb",...]索引结构。在JS中,数组是一种比较特殊的数据类型,它也可以像对象那样使用键值对,但还是索引使用得多。同样,值得类型可以是任意类型。
下面我们再了解一下decode和endcode相关知识,要想了解这个,我们有必要学习几个概念。
字节:计算机数据的表示。8位二进制,可以表示无符号整数:0~255.下文,用“字节流”表示“字节"组成的串。
字符:英文字符"abc”,或者中文字符“你我他”。字符本身不知道如何在计算机中保存。
编码:按照某种规则将文本转换为“字节流”。
解码:将“字节流”按照某种规则转换成“文本”。
实际上,任何东西在计算机中表示,都需要编码。例如,视频要编码然后保存在文件中,播放的时候需要解码才能观看。
unicode:unicode定义了,一个“字符”和一个“数字”的对应,但是并没有规定这个“数字”在计算机中怎么保存。(就像在C中,一个整数既可以是int,也可以是short。unicode没有规定用int还是用short来表示一个“字符”)
decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换成unicode编码,
encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode('gb2312'),表示将unicode 编码的字符串str2转换成gb2312编码。
现在我们可以开始看源码
-----------------------------------------------------------------------------
-- JSON4Lua: JSON encoding / decoding support for the Lua language.
-- json Module.
-- Author: Craig Mason-Jones
-- Homepage: http://json.luaforge.net/
-- Version: 0.9.40
-- This module is released under the MIT License (MIT).
-- Please see LICENCE.txt for details.
--
-- USAGE:
-- This module exposes two functions:
-- encode(o)
-- Returns the table / string / boolean / number / nil / json.null value as a JSON-encoded string.
-- decode(json_string)
-- Returns a Lua object populated with the data encoded in the JSON string json_string.
--
-- REQUIREMENTS:
-- compat-5.1 if using Lua 5.0
--
-- CHANGELOG
-- 0.9.20 Introduction of local Lua functions for private functions (removed _ function prefix).
-- Fixed Lua 5.1 compatibility issues.
-- Introduced json.null to have null values in associative arrays.
-- encode() performance improvement (more than 50%) through table.concat rather than ..
-- Introduced decode ability to ignore /**/ comments in the JSON string.
-- 0.9.10 Fix