【简明教程】JSON

JSON概览

JSON(JavaScript Object
Notation)是相同种植基于文本的数据交换格式。无论你的利用是用哪种出语言编写的(Java/EE,Ruby,PHP,C#/.Net等等),你都得使JSON来经过网开展多少交互和拍卖。几乎所有的编程语言都来那个好的仓库或者第三正工具来供基于JSON的API支持,因此若可死便于地利用其他自己好的编程语言来拍卖JSON数据。而另一方面随着REST、像MongoDB这样的NoSQL技术或专业的普遍应用,JSON也刚刚成为同种植让推荐的多寡交互格式。

JSON是在2001年,由Douglas Crockford创建的,并且为IETF(Internet
Engineering Task Force)定义为RFC
4627标准,详请参考:http://tools.ietf.org/html/rfc4627。JSON的传媒类型为定义也
application/json,而文件的后缀为.json。

JSON是什么

JSON是一样栽简单多少格式,它来三种多少结构:

  • 键值对 —— Name/Value (Key/Value)
  • 对象 —— Object
  • 数组 —— Arrays

一个行之有效的JSON文档需要让含有在平等对准花括号内

{ JSON-Data }

吁留意,有些支付社区或线上文档直接以上面的JSON文档称为JSON字符串,这二者的意思是同的。

怎么使用JSON

JSON给当是XML的良好替代者。因为JSON的可读性非常好,而且她从不如XML那样带有多冗余的素标签,这使用在使用JSON进行网络传输和开展辨析处理的快慢更快,效率又胜似。

键值对 —— Name/Value

键值对凡JSON中最基本的数据结构:

{
  “firstName”: “John”
}

于上头的例证中属性”firstName”是用同样针对性双引号括起来的一个字符串。而它的价”John”在是例子中呢是一个字符串,当然她还足以是其余品类,具体而参照后面数据类型的章。在商海上过多底制品或者技术声称他们以的是JSON数据格式,但他俩当概念属性时,并没有就此对引号将属于性名称括起来,其实就是拂JSON定义标准的。

对象 —— Object

一个JSON对象是包含了同一组未排序键值对的成团。下面例子中之address就是一个JSON对象:

{
    “address” : {
        “line1” : “555 Main Street”,
        “city” : “Denver”,
        “stateOrProvince” : “CO”,
        “zipOrPostalCode” : “80202”,
        “country” : “USA”
    }
}

点的例子中address对象涵盖了5单特性,它们之间为此,进行分割。

数组 —— Array

JSON中[]来含有数组元素,参考下面的例证:

{
    “people” : [
        { “firstName”: “John”, “lastName”: “Smith”, “age”: 35 },
        { “firstName”: “Jane”, “lastName”: “Smith”, “age”: 32 }
    ]
}

数据类型

JSON中的数值(键值对中之价)可以是以下任意一栽:

  • Object
  • Array
  • String
  • Number
  • Boolean
  • null

Number

数值类数据可是整型也堪是双精度之浮点型数据。下面是有些演示:

“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等)都是故对勾号括起来的字符串,而数值是未待为此对滋生号括起来的。你可以在数值前增长-号来代表负数,也得以应用科学计数法。但未可知当数值前加0或以16进制来表示一个数值。

Boolean

JSON中之Boolean值可以据此true或false来表示。

{
    “emailValidated” : true
}

Boolean值也未待使用对引号来修饰。

null

严格来说null并无是一个数据类型,但它们那个关键,它表示一个性能或因素没有价值。因此要小心
‘ ‘ 表示的凡空字符串,而null表示的才是空值。

{
    “age” : null
}

代码注释

JSON不同意在JSON文档或字符串中上加注。注释功能最早以JSON中凡是有的,但开发者们误地应用了其来帮JSON数据的解析,当Douglas
Crockford意识及这种糟糕的用实行后,便注销了诠释功能,以保证JSON在不同计算平台内作为交互数据格式的风味。

样式

汝或许已经注意到了以之前的例子中,所有的特性名称还使了驼峰式的命名规则。这并无是JSON的一个标准要求,但这会帮提高JSON文档的可读性,因此作为一个事实标准在备JSON应用中于采用。

语法

Douglas Crockford
在他的JSON网站http://www.json.org/着,给起了具备JSON语法语义的说明。另外还有一个iOS
App JSON Pro FREE可以据此来经过示范学习或者参阅JSON。

JSON校验

一个文本文档或字符串必须信守JSON的语法定义,才能够让作为一个卓有成效的JSON文档。JSON文档是否可行非常关键,因为它直接决定了,你的JSON数据是否在不同的行使被让科学地分析及运用。JSONLint供了一个只是交互的Web版JSON校验工具,你仅仅待将您的JSON文档粘贴进去,并点击校验按钮,它就是会自动进行校验,并拿题目显得在人世。

于上头这例子中,这个JSON对象的city属性没有添加双引号,导致校验失败。在返的提示着,显示了“Expecting
‘STRING’, got ‘undefined’”错误。

JSONLint也供了一个足以当Chrome中一直行使的插件。

JSON数据模型

于使被手工编制JSON文档,会充分单调并易错。为了防止这样的恶错误
,你可以应用JSONPad或JSON Editor
Online这样的家伙,它们会协助而构建JSON逻辑模型(类似于UML),然后通过模型生成JSON文档。

JSON Editor Online

[ JSON Editor Online]
(http://jsoneditoronline.org/)
是一个以线JSON数据建模工具,他吗提供了一个Chrome插件可以用。

浏览器被的JSON

Firefox和Chrome都提供了有的异常好的插件方便开发人员查看或处理JSON数据。

REST Client

Rest
Client凡Firefox中之一个扩展应用。他会帮助开发人员在浏览器中调试REST风格的Web
Service。它极充分的亮点是能够以回到的JSON数据结果,以充分好的格式显示出。

JSONView

JSONView是一个FireFox和Chrome上之插件,能够挺好地用JSON数据打印出,从而大大提高了JSON数据的可读性。

JSON与AJAX

AJAX可能是下JSON数据中极常见的气象了。下面的马上段代码示例,通过jQuery来调用一个REST风格的Web
Service,并拍卖回来的JSON对象。

$.getJSON(‘http://example/service/addresses/home/1’,
    function(data) {
        var address = JSON.parse(data);
        console.log(“Address Line 1 = “ + address.line1);
    }
);

于方的就段代码中,$getJSON(这是一致种jQuery中$.ajax()标准调用的等同栽缩写形式)会倡导一个HTTP
GET 请求,调用Web
Service,之后于她的隐式回调函数中,获取返回的data数据,并经JSON.parse()方法以赶回的数量易为JSON对象。之后就可以像获取普通属性那样(address.line1)获取对象的习性数值了。

JSON与JAVA

Jackson举凡JAVA中之所以来拍卖JSON的一个老三方库。它特别有名,并且提供了相同组格外好用的JSON
API。下面就其的一个例子:

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 API库。

API Source
Google GSON http://code.google.com/p/google-json/
SOJO http://sojo.sourceforge.net/
org.json (by DouglasCrockford) 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/

JSON与RUBY

Ruby中为出成百上千及JSON相关的老三方库,而JSON
gem是Ruby自带的,下面就是其的用法:

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,最终以一个Address对象转换为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.pase方法则用JSON字符串转换为哈希。Address对象的from_jason!方法接收一个JSON字符串,然后调用JSON.parse来更换哈希,然后再度于目标上各自安装这些哈希的值。

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)

除了JSON gem之外,还有以下部分Ruby的JSON第三方库

API Source
ActiveSupport JSON http://api.rubyonrails.org/classes/ActiveSupport/JSON.html
Yajl https://github.com/brianmario/yajl-ruby
Oj https://github.com/ohler55/oj

JSON与RUBY ON RAILS

Ruby on
Rails也供了将Ruby对象转换为JSON的意义。下面的例证中之Controller使用了render方法将一个Ruby对象为JSON数据的格式进行输出。

Rails中之ApplicationController会负责对象以及JSON数据里的相互转换
。因此,不待额外调用to_json方法。

JSON SCHEMA

JSON
Schema用来定义JSON文档的组织,它可让用来说明和校验发送或收取的JSON文档是否有效和业内。JSON
Schema本身也是用JSON格式编写的,它的现实定义可以参照http://json-schema.org。

脚是JSON Schema的有的结构定义:

结构 描述
type 对象的数据类型,如Object,array,string,number 等
$schema 提供Schema版本的URI
required true/false
id 数据元素id
properties 数据元素的校验属性,包括最大值,最小值,枚举等

下是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中针对JSON对象做了以下约束:

  • registrants必须是一个NoSQL数组对象
  • phoneNumber的channel必须是cell, work, fax, home中的一个
  • address的premise必须是home, work, other中的一个。

一个应用上述JSON Schema的Web Service可以分析和处理下这个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。你用看(www.jsonschema.net),然后以以下步骤操作:

  • 将你的JSON文档粘贴到右文本框
  • 挑选JSON输入选项
  • 点击Generate Schema按钮

JSON Schema 校验器

咱们得就此JSON Schema
Validator来担保我们的JSON文档时有效的。下面是对不同开发语言的片大面积的JSON
Schema 校验器。

校验器 编程语言 项目地址
JSV JavaScript https://github.com/garycourt/JSV
Ruby JSON Schema Validator Ruby https://github.com/hoxworth/jsonschema
json-schemavalidator 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
),将Schema和JSON文档粘贴到左手的文本框中,然后点击Validate按钮,校验的结果就是见面显在屏幕右侧。

总结

如上,我们已初步摸底了JSON的骨干概念及用法,但对于JSON本身来说我们尚单是询问了内好粗的同等片段,还有好多与它相关的工具或技术好运用。JSON作为一个数额标准,它曾经逐渐替代XML成为Internet上极其受欢迎之互数据格式。

简书签约作者:技匠,以上内容欢迎大家享受至朋友圈/微博等。如需转载,请通过简信联系授权。谢谢大家!

网站地图xml地图