JSONJSON入门


备注

JSON(JavaScript Object Notation)是道格拉斯·克罗克福德最初指定的最受欢迎和广泛接受的数据交换格式之一。

目前,它由两个竞争标准RFC 71592ECMA-404描述 。 ECMA标准是最小的,仅描述允许的语法语法,而RFC也提供了一些语义和安全性考虑因素。

  • JSON在软件中被广泛接受,其中包括用于在客户端和服务器之间交换数据的客户端 - 服务器体系结构。
  • JSON易于使用,纯文本,轻量级和人类可读的格式,人们经常误解为XML的替代品。
  • 尽管缩写以JavaScript开头,但JSON不是一种语言,或者具有任何语言文字,它只是数据符号的规范。
  • 它是独立于平台和语言的,几乎所有的前线语言/框架都支持内置,并且支持JSON数据格式的所有流行语言都有,其中一些是C#,PHP,Java,C ++,Python,Ruby还有很多。
  • JSON的官方Internet媒体类型是application / json。
  • JSON文件扩展名为.json。

版本

由于JSON没有任何更新,因此只有1个版本的JSON,下面的链接重定向到原始RFC文档,即RFC 4627。

发布日期
原版的 2006-07-28

JSON对象的常见示例,与相关(Java)对象相对应

在整个示例中,假设被序列化为JSON的“根”对象是以下类的实例:

public class MyJson {
}
 

示例1: MyJson 实例的MyJson ,原样如下:

{}
 

即由于该类没有字段,因此只有花括号被序列化。 Curly括号是表示对象的常用分隔符 。另请注意根对象未如何序列化为键值对。当简单类型(字符串,数字,数组)不是(外部)对象的字段时,也是如此。

示例2:让我们向MyJson 添加一些字段,并使用一些值初始化它们:

// another class, useful to show how objects are serialized when inside other objects
public class MyOtherJson {} 

// an enriched version of our test class
public class MyJson {
  String myString = "my string";
  int myInt = 5;
  double[] myArrayOfDoubles = new double[] { 3.14, 2.72 };
  MyOtherJson objectInObject = new MyOtherJson();    
}
 

这是相关的JSON表示:

{
  "myString" : "my string",
  "myInt" : 5,
  "myArrayOfDoubles" : [ 3.14, 2.72 ],
  "objectInObject" : {}
}
 

注意所有字段是如何在键值结构中序列化的,其中键是保存值的字段的名称。数组的常见分隔符是方括号。另请注意,每个键值对后跟一个逗号,最后一对除外。

手动编辑JSON

JSON是一种非常严格的格式(请参阅http://json.org) 。这使得为​​机器解析和编写变得容易,但是当一个不显眼的错误打破了文档时,人们就会感到惊讶。

常见问题

尾随逗号

与大多数编程语言不同,您不能添加尾随逗号:

{
  a: 1,
  b: 2,
  c: 3
}
 

3 之后添加逗号将产生一个synax错误。

数组存在同样的问题:

[ 
  1,
  2
]
 

如果您需要重新订购商品,则必须格外小心。

缺少逗号

{
  a: 1,
  b: 2,
  c: 3
  d: 4
}
 

由于不允许使用尾随逗号,因此在添加新值(在本例中为3 之后)之前很容易忘记附加逗号。

评论

JSON不允许注释,因为它是数据交换格式。这仍然是一个热门话题,除了不使用它们之外没有明确的答案。

有几种解决方法:

  • 使用C样式注释,然后在将它传递给解析器之前将其删除
  • 将注释嵌入数据中
{
  "//": "comment",
  "data": 1
}
 
  • 嵌入注释并用数据覆盖它们
{
  "data": "comment",
  "data": 1
}
 

第二个data 条目将覆盖大多数解析器中的注释。

解决方案

为了更容易编写JSON,请使用IDE来检查语法错误并提供语法着色。大多数编辑都可以使用插件。

在开发应用程序和工具时,请在内部使用JSON并将其作为协议使用,但尽量不要在可能需要人工编写的地方(除了调试之外)将其公开。

评估更适合此用途的其他格式,例如:

  • Hjson可以无缝转换为JSON
  • TOML ,类似于INI文件
  • YAML ,更多功能,但代价是增加了复杂性

JSON数组

JSON数组是有序的值集合。它由方括号(即[] )包围,值以逗号分隔:

{ "colors" : [ "red", "green", "blue" ] }
 

JSON Arrays还可以包含任何有效的JSON元素,包括对象,如此示例中包含2个对象的数组(取自RFC文档):

[
  {
     "precision": "zip",
     "Latitude":  37.7668,
     "Longitude": -122.3959,
     "Address":   "",
     "City":      "SAN FRANCISCO",
     "State":     "CA",
     "Zip":       "94107",
     "Country":   "US"
  },
  {
     "precision": "zip",
     "Latitude":  37.371991,
     "Longitude": -122.026020,
     "Address":   "",
     "City":      "SUNNYVALE",
     "State":     "CA",
     "Zip":       "94085",
     "Country":   "US"
  }
]
 

它们还可以包含具有混合类型的元素,例如:

[
    "red",
    51,
    true,
    null,
    {
        "state": "complete"
    }
]
 

编写JSON数组(和对象)时常见的错误是在最后一个元素后面留下一个逗号。这是许多语言中的常见模式,但遗憾的是在JSON中无效。例如,以下数组无效:

[
    1,
    2,
]
 

要使其有效,您需要删除最后一个元素后面的逗号,将其转换为:

[
    1,
    2
]
 

JSON对象

JSON对象由大括号括起,并包含键值对。

{ "key1": "value1", "key2": "value2", ... }
 

键必须是有效的字符串,因此用双引号括起来。值可以是JSON对象,数字,字符串,数组或以下“文字名称”之一: falsenulltrue 。在键值对中,键通过冒号与值分开。多个键值对用逗号分隔。

对象中的顺序并不重要。以下JSON对象因此等同于上述:

{ "key2": "value2", "key1": "value1", ... }
 

总而言之,这是一个有效的JSON对象的示例:

{
  "image": {
    "width":  800,
    "height": 600,
    "title":  "View from 15th Floor",
    "thumbnail": {
      "url": "http://www.example.com/image/481989943",
      "height": 125,
      "width":  100
    },
    "visible": true,
    "ids": [116, 943, 234, 38793]
  }
}
 

JSON语法规则

JSON(JavaScript Object Notation)语法基于JavaScript的子集(另请参阅json.org )。

有效的JSON表达式可以是以下数据类型之一

  • 简单数据类型:String,Number,Boolean,Null
  • 复合数据类型:Value,Object,Array

简单的数据类型

JSON字符串必须用双引号括起来,并且可以包含零个或多个Unicode字符;允许反斜杠转义。接受的JSON编号采用E表示法 。 Boolean是truefalse 。 Null是保留关键字null

数据类型有效JSON的示例
### String "apple"
"苹果"
"\u00c4pfel\n"
""
###号码 3
1.4
-1.5e3
###布尔值 true
false
### 空值 null

复合数据类型

JSON值可以是以下之一:String,Number,Boolean,Null,Object,Array。

宾语

JSON对象是以逗号分隔的无序的名称:值对的集合,用大括号括起来,其中name是String,值是JSON值。

排列

JSON数组是JSON值的有序集合。

JSON数组的示例:

["home", "wooden"]
 

JSON对象的示例:

{
    "id": 1,
    "name": "A wooden door",
    "price": 12.50,
    "tags": ["home", "wooden"]
}
 

[
  1,
  2,
  [3, 4, 5, 6],
  {
    "id": 1,
    "name": "A wooden door",
    "price": 12.50,
    "tags": ["home", "wooden"]
  }
]
 

用于验证和格式化JSON数据的在线工具:

数组与对象的基本原理(即什么时候使用什么)

JSON数组表示对象的集合。在JS中,有一些集合函数,例如slicepoppush 。对象只有更多的原始数据。

JSONArray是一个有序序列。它的外部文本形式是一个用方括号括起来的字符串,用逗号分隔值。

JSONObject名称/值对的无序集合。它的外部形式是一个用大括号括起来的字符串,名称和值之间有冒号,值和名称之间有逗号。

对象 - 键和值,数组 - 数字,字符串,布尔值。你什么时候使用这个或那个?

您可以将Arrays视为“是a / an”而将Objects视为“has a”。让我们以“水果”为例。水果阵列中的每个项目都是一种水果。

array fruit : [orange, mango, banana]

数组可以包含对象,字符串,数字,数组,但是我们只处理对象和数组。

array fruit : [orange:[], mango:{}, banana:{}]

。你可以看到橙色也是一个数组。它暗示任何转换为​​橙色的项目都是橙色,例如:bitter_orange,mandarin,sweet_orange。

对于水果对象,其中的任何项目都是水果的属性。因此水果有一个

object fruit :{seed:{}, endocarp:{},flesh:{}}
 

这也意味着种子对象中的任何东西都应该是种子的属性,比如:color,..

JSON主要是一种允许将javascript对象序列化为字符串的语言。因此,在反序列化JSON字符串时,您应该获得一个javascript对象结构。如果你的json反序列化为一个对象,它存储了100个对象,称为object1到object100,那么这将非常不方便。大多数反序列化器都希望您拥有已知对象和已知对象数组,以便它们可以将字符串转换为您正在使用的语言的实际对象结构。这也是面向对象设计的哲学会回答你的问题。

所有参与者的信用使用JSON数组与JSON对象有什么区别?