Elasticsearch技术解析与实战
上QQ阅读APP看书,第一时间看更新

1.3.2 JSON介绍

在Elasticsearch中的接口中,大多数都是以JSON的格式进行的,那JSON是什么呢?JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。易于人们阅读和编写,同时也易于机器解析和生成。它基于JavaScript Programming Language,Standard ECMA-2623rd Edition-December 1999的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换格式。

JSON有两种结构:

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

□值的有序列表(An ordered list of values)。在大部分语言中,是指数组(array)。

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

例1-1

1.“名称/值”对

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

{"firstName":"Brett"}

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

firstName=Brett

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

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

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

2.表示数组

当需要表示一组值时,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"}]
  "authors": [{"firstName": "Isaac""lastName": "Asimov""genre": "sciencefiction"}
    {"firstName": "Sergei""lastName": "Rachmaninoff""instrument": "piano"}]
}

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

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