Maison  >  Article  >  interface Web  >  JSON simple et efficace

JSON simple et efficace

php中世界最好的语言
php中世界最好的语言original
2018-03-16 17:31:281580parcourir

Cette fois je vous propose du JSON simple et efficace. Quelles sont les précautions pour utiliser du JSON simple et efficace Voici des cas pratiques, jetons un oeil.

JSON (JavaScript Object Notation) est un format d'échange de données basé sur du texte. Quel que soit le langage de développement dans lequel votre application est écrite (Java/EE, Ruby, PHP, C#/.Net, etc.), vous pouvez utiliser JSON pour interagir et traiter les données sur le réseau. Presque tous les langages de programmation disposent de bonnes bibliothèques ou d'outils tiers pour fournir une prise en charge des API basées sur JSON, vous pouvez donc facilement utiliser n'importe lequel de vos langages de programmation préférés pour traiter les données JSON. D'un autre côté, avec l'utilisation généralisée des technologies REST et NoSQL ou de standards comme MongoDB, JSON devient un format d'interaction de données recommandé.

JSON a été créé par Douglas Crockford en 2001 et est défini comme norme RFC 4627 par l'IETF (Internet Engineering Task Force). Pour plus de détails, veuillez vous référer à : http://tools.ietf.org/html/rfc4627. . Le type de média JSON est défini comme application/json et le suffixe du fichier est .json.

Qu'est-ce que JSON

JSON est un format de données simple, qui comporte trois structures de données :

Paire clé-valeur - Nom/Valeur (Clé/Valeur)

Object——Object

Array——Tableaux

Un document JSON valide doit être entouré d'une paire d'accolades

{ JSON-Data }

Veuillez noter que certaines communautés de développement ou documents en ligne font directement référence au document JSON ci-dessus en tant que chaîne JSON, et les deux ont la même signification.

Pourquoi utiliser JSON

JSON est considéré comme une bonne alternative au XML. Étant donné que JSON est très lisible et ne contient pas beaucoup de balises d'éléments redondantes comme XML, cela rend les applications qui utilisent JSON pour la transmission et l'analyse réseau plus rapides et plus efficaces.

Paire clé-valeur - Nom/Valeur

La paire clé-valeur est la structure de données la plus basique en JSON :

{
  “firstName”: “John”
}

Dans l'exemple ci-dessus, l'attribut " firstName" Est une chaîne entourée de guillemets doubles. Et sa valeur "John" est également une chaîne dans cet exemple. Bien entendu, elle peut également être d'autres types. Pour plus de détails, veuillez vous référer au chapitre sur les Types de données. De nombreux produits ou technologies sur le marché prétendent utiliser le format de données JSON, mais lorsqu'ils définissent des attributs, ils ne mettent pas les noms d'attribut entre guillemets. En fait, cela viole la norme de définition JSON.

Objet - Objet

Un objet JSON est une collection de paires clé-valeur non triées. L'adresse dans l'exemple suivant est un objet JSON :

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

Dans l'exemple ci-dessus, l'objet adresse contient 5 attributs, séparés par .

Array - Array

[] en JSON pour contenir des éléments de tableau, référez-vous à l'exemple suivant :

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

Type de données

en JSON Le value (la valeur dans la paire clé-valeur) peut être l'un des éléments suivants :

Object, Array, String, Number, Boolean, ull, Number

Type numériqueDonnées Il peut s'agir d'un nombre entier ou d'une donnée à virgule flottante double précision. Voici quelques exemples :

“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

Les attributs ci-dessus (tels que l'âge, etc.) sont tous des chaînes entourées de guillemets doubles, et les valeurs n'ont pas besoin d'être placées entre guillemets doubles. Vous pouvez ajouter un signe - avant la valeur pour indiquer des nombres négatifs, ou vous pouvez utiliser la notation scientifique. Mais vous ne pouvez pas ajouter 0 avant la valeur ou utiliser un format hexadécimal pour représenter une valeur.

Booléenne

Les valeurs booléennes en JSON peuvent être représentées par vrai ou faux.

{
    “emailValidated” : true}

Les valeurs booléennes n'ont pas besoin d'être modifiées avec des guillemets doubles.

null

À proprement parler, null n'est pas un type de données, mais il est très important. Cela signifie qu'un attribut ou un élément n'a aucune valeur. Veuillez donc noter que « » représente une chaîne vide et que null représente une valeur nulle.

{
    “age” : null}

Commentaires de code

JSON ne permet pas d'ajouter des commentaires aux documents ou aux chaînes JSON. La fonction d'annotation existait pour la première fois dans JSON, mais les développeurs l'ont utilisée par erreur pour faciliter l'analyse des données JSON. Lorsque Douglas Crockford a réalisé cette mauvaise pratique d'utilisation, il a annulé la fonction d'annotation pour garantir que les caractéristiques JSON soient un format de données interactif entre différentes plates-formes informatiques.

Style

Vous avez peut-être remarqué que dans les exemples précédents, tous les noms d'attributs utilisent des règles de dénomination en casse chameau. Il ne s'agit pas d'une exigence standard de JSON, mais cela peut contribuer à améliorer la lisibilité des documents JSON et est donc utilisé comme standard de facto dans toutes les applications JSON.

Syntaxe

Douglas Crockford donne une explication de toute la syntaxe et la sémantique JSON sur son site Web JSON http://www.json.org/. Il existe également une application iOS JSON Pro FREE qui peut être utilisée pour apprendre ou se référer à JSON à travers des exemples.

Validation 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代码

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn