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语法的概述。
';