>웹 프론트엔드 >JS 튜토리얼 >간단하고 효율적인 JSON

간단하고 효율적인 JSON

php中世界最好的语言
php中世界最好的语言원래의
2018-03-16 17:31:281712검색

이번에는 간단하고 효율적인 JSON을 가져왔습니다. 간단하고 효율적인 JSON 사용 시 주의사항은 무엇인가요?

JSON(JavaScript Object Notation)은 텍스트 기반 데이터 교환 형식입니다. 애플리케이션이 어떤 개발 언어(Java/EE, Ruby, PHP, C#/.Net 등)로 작성되었는지에 관계없이 JSON을 사용하여 네트워크를 통해 데이터와 상호 작용하고 처리할 수 있습니다. 거의 모든 프로그래밍 언어에는 JSON 기반 API 지원을 제공하는 좋은 라이브러리나 타사 도구가 있으므로 선호하는 프로그래밍 언어를 사용하여 JSON 데이터를 매우 편리하게 처리할 수 있습니다. 반면, REST 및 NoSQL 기술이나 MongoDB와 같은 표준이 널리 사용되면서 JSON은 권장되는 데이터 상호 작용 형식이 되고 있습니다.

JSON은 2001년 Douglas Crockford에 의해 만들어졌으며 IETF(Internet Engineering Task Force)에서 RFC 4627 표준으로 정의되었습니다. 자세한 내용은 http://tools.ietf.org/html/rfc4627을 참조하세요. JSON의 미디어 유형은 application/json으로 정의되며, 파일 접미사는 ​​.json입니다.

JSON이란 무엇입니까

JSON은 세 가지 데이터 구조를 갖는 간단한 데이터 형식입니다.

키-값 쌍—— 이름/값(키/값)

Object—— Object

배열—— 배열

유효한 JSON 문서는 중괄호 한 쌍 안에 포함되어야 합니다.

{ JSON-Data }

일부 개발 커뮤니티나 온라인 문서에서는 위 JSON 문서를 JSON 문자열로 직접 참조한다는 점에 유의하세요. .

JSON을 사용하는 이유

JSON은 XML을 대체하는 좋은 방법으로 간주됩니다. JSON은 읽기가 매우 쉽고 XML과 같은 중복 요소 태그를 많이 포함하지 않기 때문에 네트워크 전송 및 구문 분석에 JSON을 사용하는 애플리케이션을 더 빠르고 효율적으로 만듭니다.

키-값 쌍 - 이름/값

키-값 쌍은 JSON의 가장 기본적인 데이터 구조입니다.

{
  “firstName”: “John”
}

위 예에서 "firstName" 속성은 큰따옴표 쌍으로 묶인 문자열입니다. 그리고 이 예에서는 값 "John"도 문자열일 수 있습니다. 자세한 내용은 데이터 유형 장을 참조하세요. 시중의 많은 제품이나 기술은 JSON 데이터 형식을 사용한다고 주장하지만 속성을 정의할 때 속성 이름을 큰따옴표로 묶지 않습니다. 이는 실제로 JSON 정의 표준을 위반하는 것입니다.

Object - Object

JSON 개체는 정렬되지 않은 키-값 쌍의 모음입니다. 아래 예의 주소는 JSON 개체입니다.

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

위 예에서 주소 개체에는 로 구분된 5개의 속성이 포함되어 있습니다.

Array - JSON의 Array

[]에는 배열 요소가 포함되어 있습니다. 다음 예를 참조하세요.

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

Data type

JSON의 값(키-값 쌍의 값)은 다음 중 하나일 수 있습니다.

객체, 배열, 문자열, 숫자, 부울, ull, 숫자

숫자 유형 데이터는 정수 또는 배정밀도 부동 소수점 데이터일 수 있습니다. 다음은 몇 가지 예입니다.

“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

위 속성(나이 등)은 모두 큰따옴표로 묶인 문자열이며, 값을 큰따옴표로 묶을 필요는 없습니다. 값 앞에 - 기호를 추가하여 음수를 나타내거나 과학적 표기법을 사용할 수 있습니다. 그러나 값 앞에 0을 추가하거나 16진수를 사용하여 값을 나타낼 수는 없습니다.

Boolean

JSON의 부울 값은 true 또는 false로 표시될 수 있습니다.

{
    “emailValidated” : true}

부울 값은 큰따옴표로 수정할 필요가 없습니다.

null

엄밀히 말하면 null은 데이터 유형은 아니지만 매우 중요한 속성이나 요소에 값이 없다는 의미입니다. 따라서 ' '는 빈 문자열을 나타내고, null은 null 값을 나타낸다는 점에 유의하시기 바랍니다.

{
    “age” : null}

Code Comments

JSON은 JSON 문서나 문자열에 주석을 허용하지 않습니다. 주석 기능은 JSON에 처음 존재했지만 개발자가 JSON 데이터를 구문 분석하는 데 실수로 이를 사용했습니다. Douglas Crockford는 이러한 나쁜 사용 관행을 깨달았을 때 JSON 특성을 서로 다른 컴퓨팅 플랫폼 간의 대화형 데이터 형식으로 보장하기 위해 주석 기능을 취소했습니다.

Style

이전 예에서 모든 속성 이름은 낙타 표기 명명 규칙을 사용한다는 점을 눈치채셨을 것입니다. 이는 JSON의 표준 요구 사항은 아니지만 JSON 문서의 가독성을 향상시키는 데 도움이 될 수 있으므로 모든 JSON 애플리케이션에서 사실상의 표준으로 사용됩니다.

Syntax

Douglas Crockford는 그의 JSON 웹사이트 http://www.json.org/에서 모든 JSON 구문과 의미에 대한 설명을 제공합니다. 예제를 통해 JSON을 학습하거나 참조하는 데 사용할 수 있는 iOS 앱 JSON Pro FREE도 있습니다.

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

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])] }]    endend

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.newaddr2.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必须是一个数组对象

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上最受欢迎的交互数据格式。

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

全局计数的JavaScript代码

 判断相应式布局中当前适配度的JavaScript代码

限制文本字数的JavaScript代码

위 내용은 간단하고 효율적인 JSON의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.