首页 > 其他分享 >json

json

时间:2023-09-27 17:35:38浏览次数:42  
标签:city firstName lastName JSON json 字符串 数据


JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#Java、JavaScript、PerlPython等)。这些特性使JSON成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。

 

JSON 语法


编辑




JSON 语法规则



JSON 语法是 JavaScript 对象表示语法的子集。



  • 数据在键值对中
  • 数据由逗号分隔
  • 花括号保存对象
  • 方括号保存数组



JSON 名称/值对



JSON 数据的书写格式是:名称/值对。



名称/值对组合中的名称写在前面(在双引号中),值对写在后面(同样在双引号中),中间用冒号隔开:

"firstName":"John"



这很容易理解,等价于这条 JavaScript 语句:

firstName="John"





JSON 值



JSON 值可以是:





基础结构


编辑


  结构有两种结构 [2]



json简单说就是javascript中的对象和数组,所以这两种结构就是对象和数组两种结构,通过这两种结构可以表示各种复杂的结构。



1、对象:对象在js中表示为“{}”括起来的内容,数据结构为 {key:value,key:value,...}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为 对象.key 获取属性值,这个属性值的类型可以是 数字、字符串、数组、对象几种。



2、数组:数组在js中是中括号“[]”括起来的内容,数据结构为 ["java","javascript","vb",...],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是 数字、字符串、数组、对象几种。



经过对象、数组2种结构就可以组合成复杂的数据结构了。





基础示例


编辑


  ,JSON 可以将 JavaScript 对象中表示的一组数据转换为字符串,然后就可以在函数之间轻松地传递这个字符串,或者在异步应用程序中将字符串从 Web 客户机传递给服务器端程序。这个字符串看起来有点儿古怪,但是 JavaScript很容易解释它,而且 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": "sciencefiction"         


                    }, {         


                    "firstName": "Tad",         


                    "lastName": "Williams",         


                    "genre": "fantasy"         


                    }, {         


                    "firstName": "Frank",         


                    "lastName": "Peretti",         


                    "genre": "christianfiction"         


                    }],         


                    "musicians": [{         


                    "firstName": "Eric",         


                    "lastName": "Clapton",         


                    "instrument": "guitar"         


                    }, {         


                    "firstName": "Sergei",         


                    "lastName": "Rachmaninoff",         


                    "instrument": "piano"         


                    }]         


          }



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



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





格式应用


编辑


掌握了 JSON 格式之后,在 JavaScript 中使用它就很简单了。JSON 是  JavaScript 原生格式,这意味着在 JavaScript 中处理 JSON 数据不需要任何特殊的 API 或工具包。





赋值给变量



例如,可以创建一个新的 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": "sciencefiction"         


                    }, {         


                    "firstName": "Tad",         


                    "lastName": "Williams",         


                    "genre": "fantasy"         


                    }, {         


                    "firstName": "Frank",         


                    "lastName": "Peretti",         


                    "genre": "christianfiction"         


                    }],         


                    "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。





修改数据



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


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



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





换回字符串



最终结论是,如果要处理大量 JavaScript 对象,那么 JSON 是一个好选择,这样就可以轻松地将数据转换为可以在请求中发送给服务器端程序的格式。





JSON嵌套格式



许多JavaScript树形控件使用JSON嵌套格式描述树形结构,如下所示:


{           


                    id:           '100000'          ,           


                    text:           '廊坊银行总行'          ,           


                    children: [           


                    {           


                    id:           '110000'          ,           


                    text:           '廊坊分行'          ,           


                    children: [           


                    {           


                    id:           '113000'          ,           


                    text:           '廊坊银行开发区支行'          ,           


                    leaf:           true           


                    },           


                    {           


                    id:           '112000'          ,           


                    text:           '廊坊银行解放道支行'          ,           


                    children: [           


                    {           


                    id:           '112200'          ,           


                    text:           '廊坊银行三大街支行'          ,           


                    leaf:           true           


                    },           


                    {           


                    id:           '112100'          ,           


                    text:           '廊坊银行广阳道支行'          ,           


                    leaf:           true           


                    }           


                    ]           


                    },           


                    {           


                    id:           '111000'          ,           


                    text:           '廊坊银行金光道支行'          ,           


                    leaf:           true           


                    }           


                    ]           


                    }           


                    ]           


          }  



关于JSON嵌套格式可以搜索百度词条:“多叉树”。





具体形式


编辑


1、对象是一个无序的“‘名称/值’对”集合。



(1)一个对象以“{”(左括号)开始,“}”(右括号)结束。



(2)每个“名称”后跟一个“:”(冒号);



(3)“‘名称/值’ 对”之间使用“,”(逗号)分隔。(如图所示,图中表示数据的方式是类似非确定性 自动机的形式,没学过 编译原理的人,可能理解起来困难点,实际上也是 正则表达式的形式。下同)



json_数据结构与算法



例子:表示人的一个对象:


{         


                    "姓名":"大憨",         


                    "年龄":24         


          }



2、数组是值(value)的有序集合。



(1)一个数组以“[”(左中括号)开始,“]”(右中括号)结束。



(2)值之间使用“,”(逗号)分隔。



例子:一组学生

{         


                    "学生": [         


                    {"姓名":"小明","年龄":23},         


                    {"姓名":"大憨","年龄":24}         


                    ]         


          }



说明:此Json对象包括了一个学生数组,而学生数组中的值又是两个Json对象。



json_java_02



3、值(value)可以是双引号括起来的字符串(string)、数值(number)、true、false、 null、对象(object)或者数组(array)。这些结构可以嵌套。



json_数据结构与算法_03



4、 字符串(string)是由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。一个字符(character)即一个单独的字符串(character string)。 字符串(string)与C或者Java的字符串非常相似。



json_数组_04



5、数值(number)也与C或者 Java的数值非常相似。除去未曾使用的 八进制与十六进制格式。除去一些编码细节。



json_java_05





概念比较


编辑




和XML的比较



可读性



JSON和 XML的可读性可谓不相上下,一边是简易的语法,一边是规范的标签形式,很难分出胜负。



可扩展性



XML天生有很好的扩展性,JSON当然也有,没有什么是XML可以扩展而JSON却不能扩展的。不过JSON在Javascript主场作战,可以存储Javascript复合对象,有着xml不可比拟的优势。



编码难度



XML有丰富的 编码工具,比如Dom4j、JDom等,JSON也有提供的工具。无工具的情况下,相信熟练的开发人员一样能很快的写出想要的xml文档和JSON 字符串,不过,xml文档要多很多结构上的字符。



解码难度



XML的解析方式有两种:



一是通过文档模型解析,也就是通过父标签索引出一组标记。例如:xmlData.getElementsByTagName("tagName"),但是这样是要在预先知道文档结构的情况下使用,无法进行通用的封装。



另外一种方法是遍历节点(document 以及 childNodes)。这个可以通过 递归来实现,不过解析出来的数据仍旧是形式各异,往往也不能满足预先的要求。


凡是这样可扩展的结构数据解析起来一定都很困难。



JSON也同样如此。如果预先知道JSON结构的情况下,使用JSON进行数据传递简直是太美妙了,可以写出很实用美观可读性强的代码。如果你是纯粹的前台开发人员,一定会非常喜欢JSON。但是如果你是一个应用开发人员,就不是那么喜欢了,毕竟xml才是真正的结构化 标记语言,用于进行数据传递。



而如果不知道JSON的结构而去解析JSON的话,那简直是噩梦。费时费力不说,代码也会变得冗余拖沓,得到的结果也不尽人意。但是这样也不影响众多前台开发人员选择JSON。因为json.js中的toJSONString()就可以看到JSON的字符串结构。当然不是使用这个字符串,这样仍旧是噩梦。常用JSON的人看到这个字符串之后,就对JSON的结构很明了了,就更容易的操作JSON。



以上是在Javascript中仅对于数据传递的xml与JSON的解析。在Javascript地盘内,JSON毕竟是主场作战,其优势当然要远远优越于xml。如果JSON中存储Javascript复合对象,而且不知道其结构的话,我相信很多程序员也一样是哭着解析JSON的。



除了上述之外,JSON和 XML还有另外一个很大的区别在于有效数据率。JSON作为数据包格式传输的时候具有更高的效率,这是因为JSON不像XML那样需要有严格的闭合标签,这就让有效数据量与总数据包比大大提升,从而减少同等数据流量的情况下,网络的传输压力 [3]





实例比较



XML和JSON都使用 结构化方法来标记数据,下面来做一个简单的比较。



用XML表示中国部分省市数据如下:


<?          xml           version          =          "1.0"           encoding          =          "utf-8"          ?>         


          <          country          >         


                    <          name          >中国</          name          >         


                    <          province          >         


                    <          name          >黑龙江</          name          >         


                    <          cities          >         


                    <          city          >哈尔滨</          city          >         


                    <          city          >大庆</          city          >         


                    </          cities          >         


                    </          province          >         


                    <          province          >         


                    <          name          >广东</          name          >         


                    <          cities          >         


                    <          city          >广州</          city          >         


                    <          city          >深圳</          city          >         


                    <          city          >珠海</          city          >         


                    </          cities          >         


                    </          province          >         


                    <          province          >         


                    <          name          >台湾</          name          >         


                    <          cities          >         


                    <          city          >台北</          city          >         


                    <          city          >高雄</          city          >         


                    </          cities          >         


                    </          province          >         


                    <          province          >         


                    <          name          >新疆</          name          >         


                    <          cities          >         


                    <          city          >乌鲁木齐</          city          >         


                    </          cities          >         


                    </          province          >         


          </          country          >



用JSON表示如下:

{         


                    "name": "中国",         


                    "province": [{         


                    "name": "黑龙江",         


                    "cities": {         


                    "city": ["哈尔滨", "大庆"]         


                    }         


                    }, {         


                    "name": "广东",         


                    "cities": {         


                    "city": ["广州", "深圳", "珠海"]         


                    }         


                    }, {         


                    "name": "台湾",         


                    "cities": {         


                    "city": ["台北", "高雄"]         


                    }         


                    }, {         


                    "name": "新疆",         


                    "cities": {         


                    "city": ["乌鲁木齐"]         


                    }         


                    }]         


          }



编码的可读性,xml有明显的优势,毕竟人类的语言更贴近这样的说明结构。json读起来更像一个 数据块,读起来就比较费解了。不过,我们读起来费解的语言,恰恰是适合机器阅读,所以通过json的索引.province[0].name就能够读取“黑龙江”这个值。



编码的手写难度来说,xml还是舒服一些,好读当然就好写。不过写出来的 字符JSON就明显少很多。去掉空白制表以及换行的话,JSON就是密密麻麻的有用数据,而xml却包含很多重复的标记字符。





校验工具


编辑




前言



JSON格式取代了xml给网络传输带来了很大的便利,但是却没有了xml的一目了然,尤其是json数据很长的时候,我们会陷入繁琐复杂的数据节点查找中。



但是国人的一款在线工具 BeJson 、SoJson在线工具让众多程序员、新接触JSON格式的程序员更快的了解JSON的结构,更快的精确定位JSON格式错误。





功能



1 JSON格式化校验[4]



很多人在得到JSON数据后,一时没有办法判断JSON数据格式是否正确,是否少或多符号而导致程序不能解析,这个功能正好能帮助大家来完成JSON格式的校验。



2 JSON视图



想必很多程序员都会遇到当找一个节点的时候,会发现如果直接对着一行行数据无从下手,就算知道哪个位置,还要一个节点一个节点的往下找,万一一不留神又得从头开始找的麻烦事。



有了这个功能,一切JSON数据都会变成视图格式,一目了然,什么对象下有多少 数组,一个数组下有多少对象。



这个功能非常实用。不光有视图功能还有格式化、压缩、转义、校验功能。总之很强大。



3 压缩转义



程序员在写JSON语句 测试用例的时候,很多时候为了方便直接写了个JSON字符串做测试,但是又陷入了无止境的双引号转义的麻烦中。这款功能集压缩、转义于一身,让你在写测试用例的时候,如鱼得水。



4 JSON在线编辑器[4]



如果你现在的电脑刚巧没有装你所熟悉的编辑器,如果你想针对拿到的JSON数据的某个节点做数据修改时,这个功能可以满足你的需求。



5 在线发送JSON数据



大家都知道,JSON用的最多的还是web项目的开发,那你要测试一个接口是否能准确的接受JSON数据,那你就得写一个页面发送JSON字符串,重复的做着这件事。随着这个功能的横空出世,你可以摆脱写测试页面了,因为这个功能可以将指定的JSON数据发送指定的url,方便吧。



6 JSON着色






7 JSON-XML互转






8 JSON-VIEW



JSON查看实用工具,在开发过程中(windows平台中)可以对JSON数据进行格式化和视图显示。



9 它和xml一样都是一种数据交换格式





JSON的最小化



Eclipse RAP的一个提交者也是领导者的Ralf Sternberg,他只用了十个类就把快速的和轻量级的库整合到了一起。显然,使用精益和解析法真正地改善了服务器的性能,因为服务器进程以更高的效率为大量的客户创建了JSON信息。在外部JSON中不存在依赖关系,代码很容易管理,而且也不会占用很多内存。对于你的全部JSON项目来说,这还远远不够,但这确实带来了几件好事。

标签:city,firstName,lastName,JSON,json,字符串,数据
From: https://blog.51cto.com/u_16131764/7627032

相关文章

  • fastjson parseobject typereference - 指定泛型类型
    Fastjson是一种Java中非常流行的JSON解析库,它可以将JSON字符串转换为Java对象。其中,parseObject方法是Fastjson提供的一种将JSON字符串解析为Java对象的方法,而TypeReference是Java泛型中的一个类,可以用于指定泛型类型,例如List、Map<String,Integer>等等。当我们使用parseObject......
  • [JSON|序列化] fastjson自定义字段命名规则 (转发)
    1序言博主本人近期也遇到了基于fatsjson自定义命名字段规则的问题,为加强对此的学习和记忆,故转发这篇博文。博主本人最终采取的方法21.1前置知识fastjson在将对象转变为JSON字符串时,字段默认使用CamelCase规则命名。在1.2.15版本之后,fastjson支持配置Proper......
  • Qt报错: variable has incomplete typte ‘QJsonObject’
    Qt常见运行失败的记录1.变量声明未实例化变量在头文件声明了,没new出来直接使用,导致程序运行崩溃2.定义变量时候下面出行红线,出现variblehasincompletetype‘QTextStream’variblehasincompletetype'QTextStream未添加QTextStream头文件3.Qt信号与槽连接失败的几......
  • 处理日期格式问题:JSON.stringify 导致日期少一天的解决方案
    在前端开发中,经常需要处理日期数据。然而,由于JavaScript日期的表示方式以及JSON格式化日期的一些特性,可能会导致日期数据在传输或存储过程中出现问题。一个常见的问题是使用JSON.stringify对日期进行序列化时,导致日期少一天。在这篇文章中,我们将探讨这个问题,并提供解决方案。......
  • Go每日一库之24:gjson
    简介之前我们介绍过gojsonq,可以方便地从一个JSON串中读取值。同时它也支持各种查询、汇总统计等功能。今天我们再介绍一个类似的库gjson。在上一篇文章Go每日一库之buntdb中我们介绍过JSON索引,内部实现其实就是使用gjson这个库。gjson实际上是get+json的缩写,用于读取JSO......
  • json数据传输压缩以及数据切片分割分块传输多种实现方法,大数据量情况下zlib压缩以及by
    json数据传输压缩以及数据切片分割分块传输多种实现方法,大数据量情况下zlib压缩以及bytes指定长度分割。importsysimportzlibimportjsonimportmathKAFKA_MAX_SIZE=1024*1024CONTENT_MIN_MAX_SIZE=KAFKA_MAX_SIZE*0.9defsplit_data(data):""":param......
  • Chrome插件manifest.json文件详解
    {//扩展名称"name":"MyExtension",//版本。由1到4个整数构成。多个整数间用"."隔开"version":"1.0",//manifest文件版本号。Chrome18开始必须为2"manifest_version":2,//描述。132个字符以内"......
  • Json输出List集合对象和map对象 JSON格式
    Json输出List集合对象和map对象JSON格式//Json输出List集合对象[{"属性1":["值1"],"属性2":"值2"},{"属性3":["值3"],"属性4":"值4"}]importcom.alibaba.fastjson.JSONObject;importjava.util.ArrayList;impor......
  • requests 响应头部转json时报错TypeError: Object of type CaseInsensitiveDict is n
    前言requests响应头部在转json时,想格式化输出,结果报错TypeError:ObjectoftypeCaseInsensitiveDictisnotJSONserializable报错详情示例代码importrequestsimportjson#上海悠悠wx:283340479#blog:https://www.cnblogs.com/yoyoketang/r=requests.get('htt......
  • Selenium模拟登录(数字验证码)+Requests获取json数据
    前言我只是想算算每个月洗澡花了多少钱……Selenium模拟登录登录需要提交账号、密码、验证码#实例化browser=webdriver.Edge()browser.implicitly_wait(10)url1='http://card.cqu.edu.cn/'browser.get(url1)#学工号和密码user_id='学号/工号'user_psd='密码'#输入学......