9.Core Json – 总结
最后更新于:2022-04-01 05:31:04
我们讨论到了JSON的所有基础知识,但我们仅仅触及到其表面。虽然JSON是一种简单的数据格式,却有很多工具来简化设计和开发过程。 JSON是一个标准,它已经取代XML作为互联网上首选的数据交换格式,并使得开发人员可以创建高效的、可互操作的企业级应用。
8.Core Json – JSON Schema
最后更新于:2022-04-01 05:31:02
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](https://github.com/garycourt/JSV) |
| Ruby JSON Schema Validator | Ruby | [https://github.com/hoxworth/json-schema](https://github.com/hoxworth/json-schema) |
| json-schema-validator | Java | [https://github.com/fge/json-schema-validator](https://github.com/fge/json-schema-validator) |
| php-json-schema (by MIT) | PHP | [https://github.com/hasbridge/php-json-schema](https://github.com/hasbridge/php-json-schema) |
| JSON.Net | .NET | [http://james.newtonking.com/projects/json-net.aspx](http://james.newtonking.com/projects/json-net.aspx) |
除了基于特定语言的模式验证工具,有一个非常棒的在线JSON Schema验证器:http://json-schema-validator.herokuapp.com。要使用该网站,只需输入JSON文件和Schema到相应的文本框中,然后按验证按钮即可。
7.Core Json – JSON 和 Ruby on Rails
最后更新于:2022-04-01 05:31:00
| API | SOURCE |
| --- | --- |
| Google GSON | [http://code.google.com/p/google-json/](http://code.google.com/p/google-json/) |
| SOJO | [http://sojo.sourceforge.net/](http://sojo.sourceforge.net/) |
| org.json (by Douglas Crockford) | [http://www.json.org/java](http://www.json.org/java) |
| json-lib | [http://sourceforge.net/projects/json-lib/](http://sourceforge.net/projects/json-lib/) |
| json-io | [http://code.google.com/p/json-io](http://code.google.com/p/json-io) |
| jsontools | [http://jsontools.berlios.de/](http://jsontools.berlios.de/) |
| jsonbeans | [http://code.google.com/p/jsonbeans/](http://code.google.com/p/jsonbeans/) |
| ActiveSupport JSON | [http://api.rubyonrails.org/classes/ActiveSupport/JSON.html](http://api.rubyonrails.org/classes/ActiveSupport/JSON.html) |
| Yajl | [https://github.com/brianmario/yajl-ruby](https://github.com/brianmario/yajl-ruby) |
| Oj | [https://github.com/ohler55/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方法
6.Core Json – JSON和Ruby
最后更新于:2022-04-01 05:30:58
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的to*json方法将字符串或哈希值转换为JSON。 Address对象的to*json方法通过将它的数据成员转换为哈希值,然后调用to_json的散列来转换地址对象为JSON。为了将地址转换为JSON,请参考下面的列子:
~~~
addr1 = Address.new('555 Main Street', 'Denver', 'CO', '80231', 'US')
puts addr1.to_json
# Outputs the following …
{"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 = <<END
{
"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)
~~~
5.Core Json – JSON和Java
最后更新于:2022-04-01 05:30:55
Jackson (http://jackson.codehaus.org/) 库是一个流行的以[Java](http://w3cschool.codecloud.net/java/java-hello-world.html)为基础的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。
4.Core Json – JSON和Ajax
最后更新于:2022-04-01 05:30:53
AJAX(异步的JavaScript和XML)是原生的JSON用例之一。 在下面jQuery例子里,显示了[JavaScript](http://w3cschool.codecloud.net/javascript/javascript-tutorial.html)客户端如何发送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字符串
3.Core Json – 浏览器中的JSON
最后更新于:2022-04-01 05:30:51
火狐和Chrome提了供极佳的扩展组件(即add-ons(FireFox附加组件)和plugins(Chrome插件))
### REST 客户端
Rest客户端是一个火狐扩展插件,提供调试和测试来自浏览器的REST风格的web服务。能够从浏览器进行测试的能力并不新颖,但REST客户端让输出格式更具可读性。
[![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-12-04_56613d2964b2e.png)](http://w3cschool.codecloud.net/)
上面的例子告诉我们如何通过开源的API库使用Books服务。进入服务URI后,响应体以高亮的形式显示了JSON的输出结果。
## 使用JSONView美化JSON
当JSON在浏览器里以自然方式显示时,并不非常合适阅读。 JSONView是一个Firefox和Chrome可扩展组件,用来输出漂亮的JSON到浏览器。
## JSONView in Firefox
在安装了这个扩展组件并且重启Firefox浏览器后,从开源库书籍服务URI返回的JSON就可阅读了,并且你可以展开/折叠页面对象。
[![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-12-04_56613d29798b8.png)](http://w3cschool.codecloud.net/)
### 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可以美化文本为方便人们阅读的格式。
2.Core Json – JSON模型
最后更新于:2022-04-01 05:30:49
为实际的应用编写有效的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文本。
[![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2015-12-04_56613d2688a0d.png)](http://w3cschool.codecloud.net/)
最终的结果是一个有效的JSON文本,可以被使用在应用中。你也可以通过粘贴JSON文本到文本域的方式生成模型,然后点击树选项卡里的绿色向下箭头按钮。在格式选项卡里,你可以压缩或排版JSON文件为适合打印的样式。 当按下工具选项卡里的JSON按钮时,JSONPad将验证你文本区域里的JSON文件。
### JSON在线编辑器
在线JSON编辑器(http://jsoneditoronline.org/)是一个在线JSON建模器,也可以作为Chrome的扩展工具在Chrome商店被获得。
1.Core Json – JSON概述
最后更新于:2022-04-01 05:30:46
> 原文出处:http://codecloud.net/core-json-tutorial-6735.html
> 本文由[程序员的资料库技术翻译小组](http://codecloud.net/tech-article-translate-6591.html)翻译,如有错误请帮忙更正,谢谢支持。
>
> 英文原文:[Core JSON](https://dzone.com/refcardz/core-json)
>
> 欢迎转载,转载请务必保留译文出处和原文出处,谢谢合作!
[JSON(JavaScript Object Notation)](http://w3cschool.codecloud.net/json/what-is-json.html)是一种基于文本的标准数据交换格式,使应用程序通过计算机网络交换数据。因为JSON独立于编程语言和计算平台,因此用Ruby ,[Java](http://w3cschool.codecloud.net/java/java-hello-world.html)/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语法的概述。