`

JSON

阅读更多

基础结构

JSON建构于两种结构:

  1. “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象object),记录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。

  2. 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。

  这些都是常见的数据结构。事实上大部分现代计算机语言都以某种形式支持它们。这使得一种数据格式在同样基于这些结构的编程语言之间交换成为可能。

 

基础示例

简单地说[1] ,JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松地传递这个字符串,或者在异步应用程序中将字符串从 Web 客户机传递给服务器端程序。这个字符串看起来有点儿古怪,但是 JavaScript 很容易解释它,而且 JSON 可以表示比名称 / 值对更复杂的结构。例如,可以表示数组和复杂的对象,而不仅仅是键和值的简单列表。

JSON 表示名称 / 值对的方式

按照最简单的形式,可以用下面这样的 JSON 表示名称 / 值对:

 

  { "firstName": "Brett" }

 

  这个示例非常基本,而且实际上比等效的纯文本名称 / 值对占用更多的空间:

 

  firstName=Brett

 

  但是,当将多个名称 / 值对串在一起时,JSON 就会体现出它的价值了。首先,可以创建包含多个名称 / 值对的 记录,比如:

 

  { "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" }

 

  从语法方面来看,这与名称 / 值对相比并没有很大的优势,但是在这种情况下 JSON 更容易使用,而且可读性更好。例如,它明确地表示以上三个值都是同一记录的一部分;花括号使这些值有了某种联系。

 

表示数组

当需要表示一组值时,JSON 不但能够提高可读性,而且可以减少复杂性。例如,假设您希望表示一个人名列表。在 XML 中,需要许多开始标记和结束标记;如果使用典型的名称 / 值对(就像在本系列前面文章中看到的那种名称 / 值对),那么必须建立一种专有的数据格式,或者将键名称修改为 person1-firstName这样的形式。

 

  如果使用 JSON,就只需将多个带花括号的记录分组在一起:

 

  { "people": [

 

  { "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" },

 

  { "firstName": "Jason", "lastName":"Hunter", "email": "bbbb"},

 

  { "firstName": "Elliotte", "lastName":"Harold", "email": "cccc" }

 

  ]}

 

  这不难理解。在这个示例中,只有一个名为 people的变量,值是包含三个条目的数组,每个条目是一个人的记录,其中包含名、姓和电子邮件地址。上面的示例演示如何用括号将记录组合成一个值。当然,可以使用相同的语法表示多个值(每个值包含多个记录):

 

  { "programmers": [

 

  { "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" },

 

  { "firstName": "Jason", "lastName":"Hunter", "email": "bbbb" },

 

  { "firstName": "Elliotte", "lastName":"Harold", "email": "cccc" }

 

  ],

 

  "authors": [

 

  { "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" },

 

  { "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" },

 

  { "firstName": "Frank", "lastName": "Peretti", "genre": "christian fiction" }

 

  ],

 

  "musicians": [

 

  { "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" },

 

  { "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" }

 

  ] }

 

  这里最值得注意的是,能够表示多个值,每个值进而包含多个值。但是还应该注意,在不同的主条目(programmers、authors 和 musicians)之间,记录中实际的名称 / 值对可以不一样。JSON 是完全动态的,允许在 JSON 结构的中间改变表示数据的方式。

 

  在处理 JSON 格式的数据时,没有需要遵守的预定义的约束。所以,在同样的数据结构中,可以改变表示数据的方式,甚至可以以不同方式表示同一事物。

 

格式应用

例如,可以创建一个新的 JavaScript 变量,然后将 JSON 格式的数据字符串直接赋值给它:

 

  var people = { "programmers": [ { "firstName": "Brett", "lastName":"McLaughlin", "email": "aaaa" },

 

  { "firstName": "Jason", "lastName":"Hunter", "email": "bbbb" },

 

  { "firstName": "Elliotte", "lastName":"Harold", "email": "cccc" }

 

  ],

 

  "authors": [

 

  { "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" },

 

  { "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" },

 

  { "firstName": "Frank", "lastName": "Peretti", "genre": "christian fiction" }

 

  ],

 

  "musicians": [

 

  { "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" },

 

  { "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" }

 

  ] }

 

  这非常简单;现在 people包含前面看到的 JSON 格式的数据。但是,这还不够,因为访问数据的方式似乎还不明显。

访问数据

尽管看起来不明显,但是上面的长字符串实际上只是一个数组;将这个数组放进 JavaScript 变量之后,就可以很轻松地访问它。实际上,只需用点号表示法来表示数组元素。所以,要想访问 programmers 列表的第一个条目的姓氏,只需在 JavaScript 中使用下面这样的代码:

 

  people.programmers[0].lastName;

 

  注意,数组索引是从零开始的。所以,这行代码首先访问 people变量中的数据;然后移动到称为 programmers的条目,再移动到第一个记录([0]);最后,访问 lastName键的值。结果是字符串值 “McLaughlin”。

 

  下面是使用同一变量的几个示例。

 

  people.authors[1].genre // Value is "fantasy"

 

  people.musicians[3].lastName // Undefined. This refers to the fourth entry, and there isn't one

 

  people.programmers.[2].firstName // Value is "Elliotte"

 

  利用这样的语法,可以处理任何 JSON 格式的数据,而不需要使用任何额外的 JavaScript 工具包或 API。

 

修改 JSON 数据

正如可以用点号和括号访问数据,也可以按照同样的方式轻松地修改数据:

 

  people.musicians[1].lastName = "Rachmaninov";

 

  在将字符串转换为 JavaScript 对象之后,就可以像这样修改变量中的数据。

分享到:
评论

相关推荐

    最好用的c++json库 nlohmann json源代码

    最好用的c++json库 nlohmann json源代码最好用的c++json库 nlohmann json源代码最好用的c++json库 nlohmann json源代码最好用的c++json库 nlohmann json源代码最好用的c++json库 nlohmann json源代码最好用的c++json...

    C# json格式解析,Json格式字符串与C#对象相互转换,类库+使用案例,注释详细

    C# json格式转换,Json格式字符串与C#对象相互转换,类库和测试demo 写了一个json与C#对象相互装换的类库,直接调用就行,有测试案例,代码注释非常详细 部分方法: /// 将Json字符串解析为C#中的对象 /// Json格式...

    全国省市区县街道json

    全国省市区县街道json: 文件含义 文件名称 省份数据 provinces.json 城市数据 cities.json 区县数据 areas.json 乡镇(街道)数据 streets.json “省份、城市” 二级联动数据 pc.json “省份、城市” 二级联动数据...

    批量转换json到java类工具

    将json转换为javebean的工具,封装jsonschema2pojo,用户可以修改配置文件json2Beans.json,然后运行Json2JavaBean2.bat直接生成对应类。 能够批量转换json为bean,直接拷贝到项目中使用。 提醒: 需要提前安装java...

    pb通过http协议传json.zip

    pb通过http协议传json; pb通过http协议传json; pb通过http协议传json; pb通过http协议传json; pb通过http协议传json; pb通过http协议传json; pb通过http协议传json; pb通过http协议传json; pb通过http协议传json; pb...

    C# JSON 编码解码

    //Program.cs 里是一些比较极端的测试,实际使用时只需复制 JSON.cs 到项目里。 //比如类Vec2: public class Vec2 { public float x; public float y; } //编码范例: Vec2 v1 = new Vec2(); v1.x = 1.23f; v1....

    json2toml:将JSON转换为TOML

    json2toml 将JSON转换为 。例子var json2toml = require ( 'json2toml' ) ;json2toml ( { simple : true } ) ;// => 'simple = true\n'// Also supports pretty-printing optionsjson2toml ( { deeply : { option : ...

    C#.Net2.0解析Json,精简版的Newtonsoft.Json.dll,JsonReader,JsonSerializer(Json.Net)

    基于Newtonsoft.Json精简的。.Net2.0的哦 仅保留了读取和解析json数据的相关类和方法(JsonReader,JsonSerializer),去除了写入json数据以及json和xml互相转换的部分以及其他不常用的类。 编译后dll仅20kb 也可以直接...

    mysql 解析json字符串

    mysql解析Json字符串插件 安装方法 1、拷贝lib_mysqludf_json_parsing.dll到mysql目录C:\Program Files\MariaDB 5.5\lib\plugin下 2、在数据库中执行 DROP FUNCTION json_get; CREATE FUNCTION json_get RETURNS ...

    电视源json电视源json电视源json电视源json

    电视源json

    在Shell命令行处理JSON数据的方法

    因为最近要处理一些 JSON 数据格式,所以在经过一番搜索后 最终找到了 jq 这个很棒的工具。jq 允许你直接在命令行下对 JSON 进行操作,包括分片、过滤、转换等等。 让我们通过几个例子来说明 jq 的功能: 一、输出...

    中国全国城市列表JSON数据2022最新

    中国城市列表JSON数据,中国所有城市,中国省市列表 2022最新json数据,2022年8月9日更新,因为最近需要用到中国省市列表的JSON数据 本来想把县也包含进去的,但是数量太多了~ 中国总共有23个省、5个自治区、4个直辖...

    全国省市区县街道json格式数据信息

    全国省市区县街道json: 文件含义 文件名称 省份数据 provinces.json 城市数据 cities.json 区县数据 areas.json 乡镇(街道)数据 streets.json “省份、城市” 二级联动数据 pc.json “省份、城市” 二级联动数据...

    json paser 属于idea插件 用于解析json

    json paser 属于idea插件 用于解析json json paser 属于idea插件 用于解析json json paser 属于idea插件 用于解析json json paser 属于idea插件 用于解析json json paser 属于idea插件 用于解析json json paser 属于...

    Vue加载json文件的方法简单示例

    本文实例讲述了Vue加载json文件的方法。分享给大家供大家参考,具体如下: 一、在build/dev-server.js文件里 var app = express() 这句代码后面添加如下(旧版): var appData = require('../address.json'); // ...

    Flume 抽取MYSQL Oracle数据 JSON格式 推送Kafka

    Flume二次开发,支持抽取MYSQL Oracle数据库数据 以JSON格式推送至Kafka。 demo: sql_json.sources.sql_source.type = com.hbn.rdb.source.SQLSource sql_json.sources.sql_source.connectionurl = jdbc:oracle:...

    PB调用http、api,PB解析json.zip

    PB调用http、api,PB解析json; PB调用http、api,PB解析json; PB调用http、api,PB解析json; PB调用http、api,PB解析json; PB调用http、api,PB解析json; PB调用http、api,PB解析json; PB调用http、api,PB解析...

    android解析通过http返回的json数据 包括服务器json数据

    1. 例子代码有两部分:androidJson是andoird的工程,inxdex.php是php服务器json数据产生部分代码。 2. 服务器端提供http(get)获取方式获取json数据的api例子,是用php写的。 4. android的apk给你说完成http数据...

    MFC使用json11解析JSON

    MFC使用JSON11将json,包括json字符串转对象,对象转json字符串

Global site tag (gtag.js) - Google Analytics