JSON新手入门指南

JSON

JSON新手入门指南_第1张图片

原文(本人原创):

  • JSON入门详解(一)-星拱北辰的CSDN博客
  • JSON入门详解(二)-星拱北辰的CSDN博客

学习资料:

  • awesome-json
  • awesome-json-datasets

目录:

  • JSON简介
  • Demo
  • JSON数据类型
    • JSON对象
    • JSON数组
    • JSON字符串
    • JSON数值
    • JSON布尔值
    • null
  • JSON注释
  • JSON文件及MIME类型
  • JSON编码规范
    • JSON属性名
    • JSON日期值
    • JSON经纬度值
    • JSON编码缩进
  • JSON与XML
  • 高级编程语言操作JSON数据
    • JavaScript操作JSON数据
      • JSON.parse()
      • JSON.stringify()
      • JSON访问对象值
      • JSON循环读取对象
      • JSON修改对象值
      • JSON删除对象值
      • JSON访问数组元素
    • Python操作JSON数据
    • Java操作JSON数据
  • JSON工具
    • JSON语法校验器
    • JSON在线解析器
  • JSON注意事项

JSON简介

JavaScript对象表示法(JavaScript Object Notation,JSON)由Douglas Crockford于2001年提出,已经成为RESTful接口设计中的事实标准,JSON数据格式使得应用程序可以通过RESTful API等方式在网络上进行数据通信,架构师和开发人员可以使用一整套现成的技术生态系统(鲜为人知的标准、工具和相关技术)来搭建设计精巧的应用程序。

JSON非常简单,由对象、数组、键值对这三种开发人员熟悉的结构体所组成。除了表现层状态转化(REpresentational State Transfer,REST),JSON在Node.js、MongoDB等NoSQL数据库、Kafka等消息平台等环境中也有应用。对于设计或实现Web移动端应用程序、RESTful API以及消息系统的架构师和开发人员,JSON都是有必要学习和研究的内容。

JSON不局限于某项技术,本身非私有,且可移植。对于产生(序列化)和读取(反序列化)JSON数据,绝大多数主流的现代编程语言和平台都可以提供优秀的JSON支持,如JavaScript、Ruby、Java、Groovy、Go、Scala、Perl、PHP、Python、Clojure、C#等等。

JSON是JavaScript对象字面量表示法的一个子集,因此可以无缝的与JavaScript开发融为一体。而JSON不仅仅是Ajax调用中XML的一个简单的替代品,它也日益成为互联网数据交换领域的骨干元素。严谨的标准和技术最佳实践加上对JSON的喜爱,有利于搭建一个真正优雅、有用而又高效的应用程序。事实上,现在能够用XML实现的功能都可以(也应当)用JSON实现。

JSON非常简洁,并且正在逐步替代XML成为互联网上主要的数据交换格式。它易于阅读,相关结构也很容易与软件开发人员所熟悉的概念对应起来,例如数组、对象和键值对。我们不用再挠头苦思某个东西应当是元素还是属性,也不用就这一点与人争论不休。与XML相比,对象及其数据成员这一组合更适合面向对象的设计和开发。由于节省了每个元素的开始标签与结束标签,JSON格式的额外开销更少、更为紧凑,所以JSON格式的文档一般比XML文档小。从企业级应用角度来看,与XML相比,JSON文档在网络上传递与处理更快,因此效率更高。

虽然JSON被设计为一种数据交换格式(通常用于REST),但如今JSON在配置文件中也占有一席之地,如Node.js和SublimeText等广泛应用的。Node.js使用package.json文件来定义其标准的npm包结构;SublimeText作为Web开发社区一款流行IDE,使用JSON来配置外观和包管理器。

总而言之,JSON广泛流行的主要原因有:

  • 基于JSON和RESTful API的爆发式增长
  • JSON基本数据结构的简洁性
  • JavaScript的日益流行

创始人Douglas Crockford认为JSON核心标准不会有新的版本,开发社区有新需要时,新的数据格式将直接替代JSON。

事实上,JSON标准唯一化的目的是避免支持早期版本而在向后兼容的时候遇到陷阱(哪怕当前不是那么完美)。

然而,“无版本”的理念仅适用于JSON核心数据格式,有些标准是JSON社区中其他人员提出的。

⬆ TOP

Demo

这里基于jslint工具校验JSON格式。

{
   
  "description": "hello, json!"
}

JSON新手入门指南_第2张图片

[
  "also",
  "a",
  "valid",
  "JSON",
  "doc"
]

JSON新手入门指南_第3张图片

⬆ TOP

JSON数据类型

JSON有六种数据类型:

  • 对象({}):键值对的无序集合
  • 数组([]):值的有序集合
  • 字符串(""
  • 数值(整数 或 浮点数)
  • 布尔值(truefalse
  • 空(null

JSON对象

JSON本质上在键值对中存储数据,键值对中的数据用逗号(,)分隔,Key与Value之间用冒号(:)分隔。

每一个键名(如"name")应该位于冒号(:)左边,而每一个键值(如"小明")位于冒号的右边。

{
   
  "name": "小明",
  "ID": "123456",
  "University": "Zhejiang University"
}

JSON对象由键值对组成,具有以下特征:

  • 由左大括号{ 和右大括号}括起来
  • 由一些无序的名称-值对构成,以逗号分隔
  • 可以是空对象{}
  • 可以内嵌在其他对象或者数组中

一个普通的JSON对象:

{
   
  "address" : {
   
    "line1" : "555 Any Street",
    "city" : "Denver",
    "stateOrProvince" : "CO",
    "zipOrPostalCode" : "80202",
    "country" : "USA"
  }
}

一个带有内嵌数组的JSON对象:

{
   
  "speaker" : {
   
    "firstName" : "Larson",
    "lastName" : "Richard",
    "topics" : ["JSON", "REST", "SOA"]
  }
}

一个内嵌其他JSON对象的JSON对象:

{
   
  "speaker" : {
   
    "firstName" : "Larson",
    "lastName" : "Richard",
    "topics" : ["JSON", "REST", "SOA"],
    "address" : {
   
      "line1" : "555 Any Street",
      "city" : "Denver",
      "stateOrProvince" : "CO",
      "zipOrPostalCode" : "80202",
      "country" : "USA"
    }
  }
}

JSON数组

JSON数组具有以下特征:

  • 由左中括号[和右中括号]括起来
  • 由一些有序的值构成,以逗号分隔
  • 可以是空数组[]
  • 可以内嵌在其他数组或者对象中
  • 具有以0或1开头的索引

一个内嵌其他对象和数组的数组:

{
   
  "speakers": [
    {
   
      "firstName" : "Larson",
      "lastName" : "Richard",
      "topics" : ["JSON", "REST", "SOA"],
      "address" : {
   
        "line1" : "555 Any Street",
        "city" : "Denver",
        "stateOrProvince" : "CO",
        "country" : "USA"
      }
    },
    {
   
      "firstName" : "Tom",
      "lastName" : "Green",
      "topics" : ["JSON", "REST", "SOA"],
      "address" : {
   
        "line1" : "Fifth Avenue",
        "city" : "New York",
        "stateOrProvince" : "New York",
        "country" : "USA"
      }
    }
  ]
}

JSON字符串

JSON字符串具有以下特征:

  • JSON字符串由包含在双引号(" ")里面的零个或多个Unicode字符串组成。除此之外,还包括由反斜杠转义的字符:
    • '':双引号
    • \\:反斜杠
    • \/:斜杠
    • \b:退格
    • \f:换页
    • \n:换行
    • \r:回车
    • \t:Tab制表符
    • \u:后跟4位十六进制数字(表示一个Unicode字符)
  • 由单引号(’ ')引起来的JSON字符串是不合法的
[
  "fred",
  "fred\t",
  "\b",
  "",
  "\t",
  "\u004A"
]

JSON数值

JSON数值具有以下特征:

  • 数值永远是十进制数(只能出现数字0~9),不能以0开头
  • 数值可以存在由小数点(.)开头的小数部分
  • 数值可以是以10为底的指数,该指数用e或者E来表示,其后跟正号表示正指数幂(也可以不加),跟负号表示负指数幂
  • 数值不支持八进制数和十六进制数
  • 与JavaScript不同,数值不能是NaN后者Infinity
  • 浮点数值遵循JavaScript的双精度浮点数类型
{
   
  "age" : 29,
  "cost" : 299.99,
  "temperature" : -10.5,
  "unitPrice" : 0.2,
  "speedOfLight1" : 1.23E11,
  "speedOfLight2" : 1.23e+11,
  "avogadro1" : 6.023e23,
  "avogadro2" : 6.023E+23,
  "oneHundredth" : 10e-3,
  "ontTenth" : 10E-2
}

JSON布尔值

JSON布尔值存在以下特征:

  • 二值逻辑,只存在true或者false
  • 冒号(:)右边的true或者false不能用引号括起来
{
   
  "isRegistered" : true,
  "emailValidated" : false
}

null

严格意义上讲,null并不是一种类型,而是JSON中的一个特数值,表示数据缺失或无意义。

null具有以下特征:

  • 不能由括号括起来
  • 表示某个键或属性没有值或没有意义
  • 可用作占位符
{
   
  "address" : {
   
    "line1" : "555 Any Street",
    "line2" : null,
    "city" : "Denver",
    "stateOrProvince" : "CO",
    "zipOrPos

你可能感兴趣的:(杂文记录,json,java)