JSON 核心教程

来源:互联网 发布:手机淘宝口令怎么设置 编辑:程序博客网 时间:2024/04/25 03:59

转自

http://codecloud.net/core-json-tutorial-6735.html

目录:

  • 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
# 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)

7.Core Json – JSON 和 Ruby on Rails

APISOURCEGoogle GSONhttp://code.google.com/p/google-json/SOJOhttp://sojo.sourceforge.net/org.json (by Douglas Crockford)http://www.json.org/javajson-libhttp://sourceforge.net/projects/json-lib/json-iohttp://code.google.com/p/json-iojsontoolshttp://jsontools.berlios.de/jsonbeanshttp://code.google.com/p/jsonbeans/ActiveSupport JSONhttp://api.rubyonrails.org/classes/ActiveSupport/JSON.htmlYajlhttps://github.com/brianmario/yajl-rubyOjhttps://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结构包括:

CONSTRUCTDESCRIPTIONtypeThe data type – object, array, string, number, etc.$schemaThe URI that provides the schema version.requiredtrue/falseidData element idpropertiesValidation 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 VALIDATORLANGUAGESOURCEJSVJavaScripthttps://github.com/garycourt/JSVRuby JSON Schema ValidatorRubyhttps://github.com/hoxworth/json-schemajson-schema-validatorJavahttps://github.com/fge/json-schema-validatorphp-json-schema (by MIT)PHPhttps://github.com/hasbridge/php-json-schemaJSON.Net.NEThttp://james.newtonking.com/projects/json-net.aspx

除了基于特定语言的模式验证工具,有一个非常棒的在线JSON Schema验证器:http://json-schema-validator.herokuapp.com。要使用该网站,只需输入JSON文件和Schema到相应的文本框中,然后按验证按钮即可。

9.Core Json – 总结

我们讨论到了JSON的所有基础知识,但我们仅仅触及到其表面。虽然JSON是一种简单的数据格式,却有很多工具来简化设计和开发过程。 JSON是一个标准,它已经取代XML作为互联网上首选的数据交换格式,并使得开发人员可以创建高效的、可互操作的企业级应用。

本文由程序员的资料库技术翻译小组翻译,如有错误请帮忙更正,谢谢支持。

英文原文:Core JSON

欢迎转载,转载请务必保留译文出处和原文出处,谢谢合


0 0