目录:
Core Json – JSON概述
Core Json – JSON模型
Core Json – 浏览器中的JSON
Core Json – JSON和Ajax
Core Json – JSON和Java
Core Json – JSON和Ruby
Core Json – JSON 和 Ruby on Rails
Core Json – JSON Schema
Core Json – 总结
1.Core Json – JSON概述
JSON(JavaScript Object Notation)是一种基于文本的标准数据交换格式,使应用程序通过计算机网络交换数据。因为JSON独立于编程语言和计算平台,因此用Ruby ,Java/EE,Javascript,C#/.Net,PHP等编程语言写的程序,可以很容易的消耗和产生JSON数据。而与JSON相关的API和工具十分丰富,这让你很容易的将JSON运用在你喜爱的编程语言,IDE 和运行环境里。此外,流行的NoSQL数据库,诸如MongoDB和ConchBase,都是基于JSON的。
在2001年,JSON被道格拉斯•克罗克福德创建,并在RFC4627与IETF(因特网工程任务组)标准中被规定;详情见 http://tools.ietf.org/html/rfc4627。根据规范,JSON的IANA(互联网数字分配机构)媒体类型是应用/json,文件类型是json。
什么是JSON?
JSON是一种简单的数据格式,它有三种基本的数据结构:
键/值对。
对象。
数组。
有效的JSON文件总是被大括号围绕,像这样:
{ JSON-Data }
请注意,JSON社区的一些成员使用术语“字符串”而不是“文档”来描述JSON 。
为什么要用JSON?
在因特网上,JSON正逐渐代替XML成为首选的数据交换格式,这是因为JSON容易阅读并且它的结构匹配常见的编程概念,诸如对象和数组。JSON也比XML更高效(即更快的解析和网络传输),这是因为JSON更紧凑——没有开始和结束标签。
键/值对
键/值对看起来像这样:
{
“firstName”: “John”
}
属性名(即第一个名字)是被双引号环绕的字符串。值可以是字符串(如上面的例子),但这仅是有效数据类型中的一组。(请查看数据类型章节获取更多细节。)一些著名的科技公司申称他们使用JSON数据格式,但是他们并不用引号环绕他们的字符串。然而,这不是有效的JSON;请查看JSON验证章节获得更多信息。
对象
对象是无序键/值对的集合。下面的例子展示了一个地址对象:
{
“address” : {
“line1” : “555 Main Street”,
“city” : “Denver”,
“stateOrProvince” : “CO”,
“zipOrPostalCode” : “80202”,
“country” : “USA”
}
}
对象(这里是指地址)被环绕在大括号里,由一对对被逗号分割的键/值对组成。
数组
数组是有序值的集合,数组看起来像这样:
{
“people” : [
{ “firstName”: “John”, “lastName”: “Smith”, “age”: 35 },
{ “firstName”: “Jane”, “lastName”: “Smith”, “age”: 32 }
]
}
值类型
值(即键/值对右手边的)可以是下列任一类型:
对象
数组
字符串
数字
布尔值
null
数字 数字可以是整数或者双精度浮点型。这里有一些例子: “age”: 29
“cost”: 299.99
“temperature”: -10.5
“speed_of_light”: 1.23e11
“speed_of_light”: 1.23e+11
“speed_of_light”: 1.23E11
“speed_of_light”: 1.23E+11
属性名(如age等)是被双引号环绕的字符串,但是值没有引号。数字可以有负号。紧跟在数值后面的指数部分(记作e或E),可以选择正负号。将0,八进制放在数值前是不被允许的,十六进制同样不被允许 。
布尔值
在JSON里,布尔值要么是真,要么是假,如下:
{
“emailValidated” : true
}
属性名(emailVaild)是被双引号环绕的字符串,但是值(true)没有引号。
null
虽然从技术层面上说null不是一个数据类型,它是一个特殊的值,可以用来表示数据元素没有值。在下面的例子里, 年龄的作用域没有值(也许是因为用户选择不填写这个信息):
{
“age” : null
}
注释
JSON不允许有注释。注释原本是JSON的一部分,但是开发者将解析指令放入注释中,这极大地滥用了它们。当道格拉斯•克罗克福德看见开发者如此实践时,他从JSON里移除了注释,以此保持计算机平台的互操作性。
样式
也许你已经注意到属性名(及冒号的左边)使用了驼峰命名法。这不是一个准则或者标准,但是一个约定俗称的规定,这个规定被写在在谷歌的JSON样式指南里: http://google-styleguide.googlecode.com/svn/trunk/jsoncstyleguide.xml.
官方语法
道格拉斯•克罗克福德的JSON网站(http://www.json.org)提供了JSON语法的完整描述。
此外,JSON Pro Quick Guide (在iphone苹果商店里可免费获取)提供了样例和JSON语法的概述。
2.Core Json – JSON模型
为实际的应用编写有效的JSON文档可能是乏味且易出错的。 为了避免印刷错误,你可以使用JSONPad,它是一款在线JSON编译器,能让JSON设计者创建逻辑模型(与UML相似)并且生成有效的JSON文档。
JSONPad
JSONPad( 来自 http://www.jsonpad.com/en/Home.html 译者注:此网址已找不到,可通过https://code.google.com/p/json-pad/ (需要梯子)获得)是一个图形化工具,通过提供的接口,能够创建对象,键/值对和数组,避免了再去写JSON文本。JSONPad有Windows或Mac版的图形化工具,在官网也有在线编辑版。使用文本编辑区域下方的绿色加号键,去创建一个模型。下列的数据类型是被支持的:键/值对,对象和数组。模型创建完后,点击蓝色向上键头按钮生成有效的,适合打印的,基于模型的JSON文本。
最终的结果是一个有效的JSON文本,可以被使用在应用中。你也可以通过粘贴JSON文本到文本域的方式生成模型,然后点击树选项卡里的绿色向下箭头按钮。在格式选项卡里,你可以压缩或排版JSON文件为适合打印的样式。 当按下工具选项卡里的JSON按钮时,JSONPad将验证你文本区域里的JSON文件。
JSON在线编辑器
在线JSON编辑器(http://jsoneditoronline.org/)是一个在线JSON建模器,也可以作为Chrome的扩展工具在Chrome商店被获得。
3.Core Json – 浏览器中的JSON
火狐和Chrome提了供极佳的扩展组件(即add-ons(FireFox附加组件)和plugins(Chrome插件))
REST 客户端
Rest客户端是一个火狐扩展插件,提供调试和测试来自浏览器的REST风格的web服务。能够从浏览器进行测试的能力并不新颖,但REST客户端让输出格式更具可读性。
上面的例子告诉我们如何通过开源的API库使用Books服务。进入服务URI后,响应体以高亮的形式显示了JSON的输出结果。
使用JSONView美化JSON
当JSON在浏览器里以自然方式显示时,并不非常合适阅读。 JSONView是一个Firefox和Chrome可扩展组件,用来输出漂亮的JSON到浏览器。
JSONView in Firefox
在安装了这个扩展组件并且重启Firefox浏览器后,从开源库书籍服务URI返回的JSON就可阅读了,并且你可以展开/折叠页面对象。
Chrome中的JSONView
JSONView作为Chrome扩展插件,也可以通过Chrome Web商店获得
点击减符号展开每一个元素,并且通过来回切换展开的链接去显示/隐藏每一个展开的元素。
Chrome扩展插件JSONView比Firefox版提供了更多的功能——它可以使用户使用JSONQuery语言查询JSON文件。举个例子,在查询框内输入bibkey 来显示文本内所有的bibkey
JSONQuery是可以搜索JSON文件,并返回所需元素(或多个元素)的技术之一。
JSON SH
JSON SH是一个Chrome可扩展插件(在Google的Chrome Web商店可获得),扮演了美化JSON和验证器的角色。粘贴有效的JSON文件到页面上方的文本区域,然后JSON SH可以美化文本为方便人们阅读的格式。
4.Core Json – JSON和Ajax
AJAX(异步的JavaScript和XML)是原生的JSON用例之一。 在下面jQuery例子里,显示了JavaScript客户端如何发送HTTP GET请求到一个RESTful Web服务上,然后RESTful Web以JSON响应的形式处理请求:
$.getJSON(‘http://codecloud.net/service/addresses/home/1’,
function(data) {
var address = JSON.parse(data);
console.log("Address Line 1 = " + address.line1);
}
);
在上面的代码里,$.getJSON()(调用jQuery $.ajax()方法的快捷版本)创建了一个HTTP GET请求。在(匿名)的成功回调函数里接收JSON响应结果,并使用JSON.parse()方法解析成Javascript对象,这是ECMA-262标准的一部分—— 请查看 http://www.ecmascript.org/ 了解更多信息)。然后执行console.log()方法,就在浏览器控制台上打印出line 1的地址。相反地,JSON.stringify()方法转换JavaScript值为JSON字符串
5.Core Json – JSON和Java
Jackson (http://jackson.codehaus.org/) 库是一个流行的以Java为基础的JSON API。这里有一个如何编译一个地址对象为JSON对象,或者如何将JSON对象解析为地址对象的例子。
import java.io.Writer;
import java.io.StringWriter;
import org.codehaus.jackson.map.ObjectMapper;
public class Address {
private String line1;
private String city;
private String stateOrProvince;
private String zipOrPostalCode;
private String country;
public Address() {}
public String getLine1() {
return line1;
}
public void setLine1(line1) {
this.line1 = line1;
}
// Remaining getters and setters …
}
Address addrOut = new Address();
// Call setters to populate addrOut …
ObjectMapper mapper = new ObjectMapper();
// Reuse this.
// Marshal Address object to JSON String.
Writer writer = new StringWriter();
mapper.writeValue(writer, addrOut);
System.out.println(writer.toString());
// Unmarshal Address object from JSON String.
String addrJsonStr =
“{” +
““address” : {” +
““line1” : “555 Main Street”,” +
““city” : “Denver”,”
““stateOrProvince” : “CO”,”
““zipOrPostalCode” : “80202”,” +
““country” : “USA”” +
“}” +
“}”;
Address addrIn = mapper.readValue(addrJsonStr, Address.class);
除了Jackson外,也包含其他著名的以java为基础的JSON APIs。
6.Core Json – JSON和Ruby
Ruby有许多与JSON相关的库。下面的例子结合使用了Ruby和JSON。
require ‘json’
class Address
attr_accessor :line1, :city, :state_or_province,
:zip_or_postal_code, :country
def initialize(line1=’’, city=’’, state_or_province=’’,
zip_or_postal_code=’’, country=’’)
@line1 = line1
@city = city
@state_or_province = state_or_province
@zip_or_postal_code = zip_or_postal_code
@country = country
end
def to_json
to_hash.to_json
end
def from_json!(str)
JSON.parse(str).each { |var, val| send("#{var}=", val) }
end
private
def to_hash
Hash[instance_variables.map { |var| [var[1…-1].to_sym,
send(var[1…-1])] }]
end
end
JSON gem的tojson方法将字符串或哈希值转换为JSON。 Address对象的tojson方法通过将它的数据成员转换为哈希值,然后调用to_json的散列来转换地址对象为JSON。为了将地址转换为JSON,请参考下面的列子:
addr1 = Address.new(‘555 Main Street’, ‘Denver’, ‘CO’, ‘80231’, ‘US’)
puts addr1.to_json
{“line1”:“555 Main Street”,“city”:“Denver”,“state_or_province”:“CO”,“zip_or_postal_code”:“80231”,“country”:“US”}
JSON gem的JSON.parse方法将一个JSON字符串转换为哈希值。地址对象的from_json!方法接收一个JSON字符串,然后调用JSON.parse转换为一个Hash值,并且按照以下方式设置每一个来自哈希的对应数据成员:
json_addr = <
“line1” : “999 Broadway”, “city” : “Anytown”,
“state_or_province” : “CA”, “zip_or_postal_code” : “90210”,
“country” : “USA”
}
END
addr2 = Address.new
addr2.from_json!(json_addr)
7.Core Json – JSON 和 Ruby on Rails
API SOURCE
Google GSON http://code.google.com/p/google-json/
SOJO http://sojo.sourceforge.net/
org.json (by Douglas Crockford) http://www.json.org/java
json-lib http://sourceforge.net/projects/json-lib/
json-io http://code.google.com/p/json-io
jsontools http://jsontools.berlios.de/
jsonbeans http://code.google.com/p/jsonbeans/
ActiveSupport JSON http://api.rubyonrails.org/classes/ActiveSupport/JSON.html
Yajl https://github.com/brianmario/yajl-ruby
Oj https://github.com/ohler55/oj
Ruby on Rails提供了额外的功能,这使得转换Ruby对象为JSON更容易。下面的控制器使用ActionController的渲染方法输出地址对象到JSON:
class Person
attr_accessor :first_name, :last_name
def initialize(first_name=nil, last_name=nil)
@first_name = first_name
@last_name = last_name
end
end
class MyController < ApplicationController
def index
person = Person.new(‘John’, ‘Doe’)
respond_to do |format|
format.html # index.html.erb
format.json { render :json => person}
end
end
end
Rails的应用控制器负责编写对象为JSON格式或者解析JSON文件为对象。所以没有必要在这里写to_json方法
8.Core Json – JSON Schema
JSON Schema指定JSON文件的结构。 JSON Schema可以用于验证发送/接受于RESTful Web服务的内容。 JSON Schema都写在JSON里。
在http://json-schema.org可以找到主要的JSON Schema。JSON Schema是一个正在发展的Schema- JSON的架构团队刚刚发布0.4版本,在http://tools.ietf.org/html/draft-zyp-json-schema-04. 可以找到跟多细节信息。 一些重要的JSON Schema结构包括:
CONSTRUCT DESCRIPTION
type The data type – object, array, string, number, etc.
$schema The URI that provides the schema version.
required true/false
id Data element id
properties Validation properties for a data element include type (see above), minimum – minimum value, maximum – maximum value, enum, etc.
下面的例子用一个简单的JSON Schema验证网上礼品登记信息的一部分内容:
{
“type”: “object”,
“$schema”: “http://json-schema.org/draft-03/schema”,
“id”: “#”,
“required”: true,
“properties”: {
"registrants": {
"type": "array",
"id": "registrants",
"required": true,
"items": {
"type": "object",
"required": false,
"properties": {
"address": {
"type": "object",
"id": "address",
"required": true,
"properties": {
"city": {
"type": "string",
"id": "city",
"required": true
},
"country": {
"type": "string",
"id": "country",
"required": false
},
"line1": {
"type": "string",
"id": "line1",
"required": true
},
"line2": {
"type": "string",
"id": "line2",
"required": false
},
"postalCode": {
"type": "string",
"id": "postalCode",
"required": true
},
"premise": {
"type": "string",
"id": "premise",
"required": true,
"enum": [
"work",
"home",
"other"
]
},
"stateOrProvince": {
"type": "string",
"id": "stateOrProvince",
"required": true
}
}
},
"firstName": {
"type": "string",
"id": "firstName",
"required": true
},
"lastName": {
"type": "string",
"id": "lastName",
"required": true
},
"phoneNumber": {
"type": "object",
"id": "phoneNumber",
"required": true,
"properties": {
"channel": {
"type": "string",
"id": "channel",
"required": true,
"enum": [
"cell",
"work",
"home"
]
},
"number": {
"type": "string",
"id": "number",
"required": true
}
}
}
}
}
}
}
}
上面的schema:
需要注册对象的数组。
限制电话号码字段为下列值:手机,工作电话,传真或者和家用电话
限制地址字段为:家庭地址,工作地址,或其他。
一个Web服务的消费者可以使用这个模式来验证下面的JSON文件:
{
“registrants”: [
{
"firstName": "Fred",
"lastName": "Smith",
"phoneNumber": {
"channel": "cell",
"number": "303-555-1212"
},
"address": {
"premise": "home",
"line1": "555 Broadway NW",
"line2": "# 000",
"city": "Denver",
"stateOrProvince": "CO",
"postalCode": "88888",
"country": "USA"
}
}
]
}
JSON Schema生成器
创建一个JSON Schema非常的繁琐,而且容易出错的。使用JSON Schema生成器,可以生成任何有效JSON文件的Schema。访问在线JSON模式发生器(www.jsonschema.net/),并通过执行以下操作生成模式:
粘贴JSON文件到右边的文本区域。
选择JSON输入选项。
按生成模式按钮。
JSON Schema 验证器
应用程序使用JSON Schema验证器,以确保JSON文件符合Schema指定的结构。 JSON Schema验证器可用于大多数现代编程语言中:
JSON SCHEMA VALIDATOR LANGUAGE SOURCE
JSV JavaScript https://github.com/garycourt/JSV
Ruby JSON Schema Validator Ruby https://github.com/hoxworth/json-schema
json-schema-validator Java https://github.com/fge/json-schema-validator
php-json-schema (by MIT) PHP https://github.com/hasbridge/php-json-schema
JSON.Net .NET http://james.newtonking.com/projects/json-net.aspx
除了基于特定语言的模式验证工具,有一个非常棒的在线JSON Schema验证器:http://json-schema-validator.herokuapp.com。要使用该网站,只需输入JSON文件和Schema到相应的文本框中,然后按验证按钮即可。
9.Core Json – 总结
我们讨论到了JSON的所有基础知识,但我们仅仅触及到其表面。虽然JSON是一种简单的数据格式,却有很多工具来简化设计和开发过程。 JSON是一个标准,它已经取代XML作为互联网上首选的数据交换格式,并使得开发人员可以创建高效的、可互操作的企业级应用。