什么是JSON?我为什么要使用它?

What is JSON and why would I use it?

我查阅了维基百科,在谷歌上搜索了它,并阅读了官方文档,但我还没有真正理解JSON是什么,以及为什么要使用它。

我用php、mysql和javascript/html构建应用程序已经有一段时间了,如果json可以做些什么来让我的生活更轻松,代码更好,用户界面更好,那么我想了解一下。有人能给我一个简明的解释吗?


JSON(javascript对象表示法)是一种轻量级格式,用于数据交换。它基于javascript语言的一个子集(对象在javascript中的构建方式)。如MDN中所述,一些JavaScript不是JSON,而一些JSON不是JavaScript。

Web服务响应就是使用它的一个例子。在"旧"时代,Web服务使用XML作为其主要数据格式来传输回数据,但自从JSON出现(JSON格式由Douglas Crockford在RFC 4627中指定)以来,它一直是首选格式,因为它更轻。

您可以在JSON官方网站上找到更多信息。

JSON建立在两个结构上:

  • 名称/值对的集合。在各种语言中,这可以实现为对象、记录、结构、字典、哈希表、键列表或关联数组。
  • 有序的值列表。在大多数语言中,这是作为数组、向量、列表或序列实现的。

JSON结构


BR/>

JSON Object diagram

JSON Array diagram

JSON Value diagram

JSON String diagram

JSON Number diagram

下面是JSON数据的一个示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{
    "firstName":"John",
    "lastName":"Smith",
    "address": {
        "streetAddress":"21 2nd Street",
        "city":"New York",
        "state":"NY",
        "postalCode": 10021
     },
    "phoneNumbers": [
        "212 555-1234",
        "646 555-4567"
     ]
 }

Javascript中的JSON

json(在javascript中)是一个字符串!

人们通常假设所有的javascript对象都是JSON,而JSON是一个javascript对象。这是不正确的。

在javascript中,var x = {x:y}不是json,这是一个javascript对象。这两件事不一样。JSON等价物(用javascript语言表示)将是var x = '{"x":"y"}'x是string类型的对象,而不是它自己的对象。要将其转换为一个成熟的javascript对象,您必须首先分析它:var x = JSON.parse('{"x":"y"}');x现在是一个对象,但它不再是json。

参见javascript对象与JSON

在使用JSON和javascript时,您可能会尝试使用eval函数来评估回调中返回的结果,但不建议这样做,因为JSON中有两个字符(U+2028&U+2029)是有效的,但在javascript中没有(请阅读此处的更多内容)。

因此,在评估前必须始终尝试使用crockford的脚本来检查有效的JSON。到脚本解释的链接在这里找到,这里是到JS文件的直接链接。现在每个主要的浏览器都有自己的实现。

关于如何使用JSON解析器的示例(使用上面代码段中的JSON):

1
2
3
4
5
6
7
//The callback function that will be executed once data is received from the server
var callback = function (result) {
    var johnny = JSON.parse(result);
    //Now, the variable 'johnny' is an object that contains all of the properties
    //from the above code snippet (the json example)
    alert(johnny.firstName + ' ' + johnny.lastName); //Will alert 'John Smith'
};

JSON解析器还提供了另一种非常有用的方法,stringify。这个方法接受一个javascript对象作为参数,并输出一个JSON格式的字符串。当您想将数据发送回服务器时,这很有用:

1
2
3
var anObject = {name:"Andreas", surname :"Grech", age : 20};
var jsonFormat = JSON.stringify(anObject);
//The above method will output this: {"name":"Andreas","surname":"Grech","age":20}

上述两种方法(parsestringify也采用第二个参数,这是一个函数,将在最终结果的每个级别调用每个键和值,并且每个值将替换为您输入的函数的结果。(这里有更多内容)

顺便说一句,对于所有认为JSON只是用于JavaScript的人来说,请看这篇文章,它解释并确认了其他情况。

工具书类

  • JSON.org
  • 维基百科
  • 3分钟内完成JSON(感谢MSON)
  • 在雅虎上使用json!Web服务(感谢Gljivar)
  • JSON到CSV转换器
  • 替代JSON到CSV转换器
  • json lint(json验证器)


简而言之,JSON是一种以这样的方式序列化的方法,它变成了JavaScript代码。执行时(使用eval或其他方法),此代码创建并返回一个包含序列化数据的javascript对象。这是因为javascript允许以下语法:

1
2
3
4
5
6
7
var MyArray = [ 1, 2, 3, 4]; // MyArray is now an array with 4 elements
var MyObject = {
    'StringProperty' : 'Value',
    'IntProperty' : 12,
    'ArrayProperty' : [ 1, 2, 3],
    'ObjectProperty' : { 'SubObjectProperty': 'SomeValue' }
}; // MyObject is now an object with property values set.

您可以将其用于多种用途。首先,它是一种将数据从服务器后端传递到JavaScript代码的舒适方法。因此,这通常在Ajax中使用。

您还可以将它用作独立的序列化机制,这比XML更简单,占用的空间也更少。存在许多库,允许您为各种编程语言在JSON中序列化和反序列化对象。


以上所有答案都集中在细节上。所以我会尽力解释这个概念,这样你就能理解上面的内容了。

JSON是什么?–我如何向我的妻子解释

我:"这基本上是一种与人进行书面交流的方式……但有规则。

妻子:是吗?

我:让我们以英语为例:我们有规则——句号、逗号、括号、连字符、撇号等,它们都有不同的含义。基本上,我们都同意完全停止是什么意思(也就是说,当我们读到一个停止时应该暂停)。

妻子:那么你是说JSON是一种给别人写英语的方式,但是它有双方都同意的规则吗?

我:没错!但这些规则非常具体。在平淡无奇的英语中,规则是相当宽松的:就像打笼子一样:你可以做你想做的任何事情,除了一些基本的事情(例如挖眼)。例如,如果我想告诉国税局关于我们家的事情,我可以用一些普通的英语来做。注意各方面的差异:

我:

?例1:我们家有4个人:你,我和2个孩子。

?例2:我们的家庭:你,我,孩子1和孩子2。

?例3:家庭:【你,我,孩子1,孩子2】

?例4:我们家有4个人:妈妈,爸爸,孩子1和孩子2。

妻子:好的,我拿到照片了。你可以用许多不同的英语说同样的话。你可以在这里和那里添加一些单词,在这里和那里添加一些逗号,每个人都会理解。

我:没错。除了在JSON中,这些规则是非常严格的。你只能以某种方式交流。你必须遵守这些规则,让别人理解它:括号,某些地方的逗号。

妻子:他们为什么不用简单的英语代替呢?

我:他们会的,但记住我们在处理电脑。电脑是愚蠢的,不能理解句子。所以我们必须非常具体地说明,当涉及到计算机时,否则它们会混淆。此外,JSON是一种相当有效的通信方式,因此大多数不相关的东西都被切掉了,这是非常容易做到的。如果你想把我们的家人和电脑联系起来,你可以这样做:

1
2
3
{
               "Family" :  ["Me","Wife","Kid1","Kid2"]
}

……这基本上就是JSON。但请记住,您必须遵守JSON语法规则。如果你违反了这些规则,那么一台计算机根本就无法理解(即解析)你在写什么。

妻子:那我怎么用JSON写呢?

我:阅读以上答案了解具体情况。简而言之,您必须使用键值对和数组来进行通信。

总结

JSON is basically a way of communicating data to someone, with very, very specific rules.


简而言之,它是用于传递数据的脚本符号。在某些方面,它是XML的替代方案,本机支持基本数据类型、数组和关联数组(名称-值对,称为对象,因为这是它们所表示的)。

语法是在javascript和json本身中使用的,它代表"javascript对象表示法"。然而,它已经成为可移植的,并在其他语言中使用。

这里有一个有用的详细链接:

网址:http://secretgeek.net/json_3mins.asp


JSON格式通常用于通过网络连接对结构化数据进行序列化和传输。它主要用于在服务器和Web应用程序之间传输数据,作为XML的替代方案。


JSON是JavaScript对象表示法。与XML相比,它是一种更紧凑的跨网络连接传输数据集的方法。我建议在任何类似Ajax的应用程序中使用JSON,否则XML将是"推荐"选项。XML的冗长将增加下载时间并增加带宽消耗($$)。您可以使用JSON实现相同的效果,它的标记几乎完全专用于数据本身,而不是底层结构。


常见的简短回答是:如果您使用Ajax进行数据请求,那么可以很容易地以JSON字符串的形式发送和返回对象。javascript的可用扩展支持对所有javascript类型的tojson()调用,以便在Ajax请求中向服务器发送数据。Ajax响应可以返回JSON字符串形式的对象,这些字符串可以通过简单的eval调用转换为javascript对象,例如,如果Ajax函数someAjaxFunctionCallReturningJSON返回

1
"{ "FirstName" : "Fred", "LastName" : "Flintstone" }"

你可以用javascript写

1
2
3
var obj = eval("(" + someAjaxFunctionCallReturningJson().value +")");
alert(obj.FirstName);
alert(obj.LastName);

JSON也可以用于Web服务有效负载等,但它对于Ajax结果非常方便。

  • 更新(十年后):不要这样做,使用json.parse


JSON是什么?

Javascript对象表示法(JSON)是一种轻量级的数据交换格式,其灵感来自于Javascript的对象文本。

JSON值可以包括:

对象(名称-值对的集合)数组(值的有序列表)字符串(双引号)数字真、假或空

JSON独立于语言。

用PHP实现JSON?

在php 5.2.0版本之后,json扩展将作为默认值解码和编码功能。

json_encode-返回值的json表示形式json_decode-解码json字符串json_last_error-返回上次发生的错误。

JSON语法和规则?

JSON语法源于javascript对象表示法语法:

数据在名称/值对中数据用逗号分隔大括号容纳对象方括号保留数组


我喜欢JSON主要是因为它非常简洁。对于可以gzip的Web内容,这不一定是什么大问题(因此XHTML为什么如此流行)。但有时这是有益的。

例如,对于一个项目,我正在传输需要通过XMPP序列化和传输的信息。由于大多数服务器都会限制您在单个消息中传输的数据量,所以我发现使用JSON来替代明显的XML是很有帮助的。

另外一个好处是,如果您熟悉Python或JavaScript,那么您已经非常了解JSON,并且可以在不经过任何培训的情况下解释它。


JSON和常规语法的区别如下(在javascript中)

常规的

1
2
3
4
5
6
7
8
9
10
11
 function Employee(name, Id, Phone, email){

      this.name = name;
      this.Id = Id;
      this.Phone = Phone;
      this.email = email;
  }

  //access or call it as

var Emp = new Employee("mike","123","9373849784","[email protected]");

用JSON

如果我们使用JSON,我们可以用不同的方式定义为

1
2
3
4
5
6
7
8
9
10
11
  function Employee(args){

   this.name = args.name;
   this.Id = args.Id;
   this.Phone = args.Phone;
   this.email = args.email;
}

//now access this as...

var Emp = new Employee({'name':'Mike', 'Id':'123', 'Phone':'23792747', 'email':'[email protected]'});

我们必须记住的重要一点是,如果必须使用100个元素构建"Employee"类或模式,而不使用JSON方法,那么在创建类时必须解析所有内容。但是,使用JSON,只有在为类定义新对象时,我们才能内联定义对象。

下面这一行是使用JSON做事情的方法(只是定义事情的一种简单方法)

1
 var Emp = new Employee({'name':'Mike', 'Id':'123', 'Phone':'23792747', 'email':'[email protected]'});


我们要做一个关于大学的项目,我们面临着一个很大的问题,这就是所谓的同宗政策。另外,它使得JavaScript中的xmlhttpRequest方法不能向站点所在的域以外的域发出请求。

例如,如果您的站点位于www.example.com,则不能向www.otherexample.com发出请求。JSONREQUEST允许这样做,但是如果该站点允许这样做,您将得到JSON格式的结果(例如,它有一个以JSON格式返回消息的Web服务)。这可能是您可以使用JSON的一个问题。

这里有一些实用的东西:雅虎JSON


JSON(javascript对象表示法)是一种用于数据交换/传输的轻量级数据格式。它的键值对与JavaScript相同。对于RESTAPI,它广泛用于从服务器到客户机的数据传输。如今,许多社交媒体网站都在使用这一功能。尽管在数据类型方面,我不认为这像XML那样健壮。XML具有非常丰富的数据类型和XSD。JSON在这方面有点欠缺。

对于相同数量的字符串数据,JSON将比XML更轻,因为XML具有所有的打开和关闭标记等…


有时在不需要的地方给出了技术性的答案,虽然许多最受欢迎的答案都是准确的技术性和具体的,但我个人认为它们不再像维基百科或官方文档中那样容易理解或简洁。

我认为JSON的方式正是它的本质——一种在不同语言世界中的语言。然而,JSON和其他语言的区别在于"每个人"都"说"JSON,以及他们的"母语"。

以现实世界为例,假设我们有三个人。一个人说伊博语是他们的母语。第二个人想和第一个人交流,但是第一个人说约鲁巴语作为他们的第一语言。

我们能做什么?

谢天谢地,在我们的例子中,第三个人是讲英语长大的,但同时也会说伊博语和约鲁巴语作为第二语言,因此可以充当前两个人之间的中间人。

在编程世界中,第一个"人"是python,第二个"人"是ruby,第三个"人"是json,恰好能够将ruby"翻译"成python,反之亦然!显然,这个类比不是一个完美的类比,但是,作为一个双语的人,我相信这是一个简单的方法来观察JSON如何与其他编程语言交互。


这很简单。JSON代表Java脚本对象表示法。把它看作是使用XML在软件组件之间传输数据的替代方法。

例如,我最近编写了一组返回JSON的Web服务,一些JavaScript开发人员随后编写了调用这些服务的代码,并使用了以这种格式返回的信息。


在Java上下文中,JSON可能想要使用的一个原因是它提供了一个非常好的替代Java序列化框架的方法,该框架在历史上已经显示出受到一些相当严重的漏洞的影响。

Joshua Bloch在第85项"更喜欢Java序列化的替代品"(有效Java第三版)中对此进行了深入的讨论。

Java的序列化最初意味着将数据结构转换成易于传输或存储的格式。JSON满足了这个要求,没有上面提到的严重漏洞。


尝试以下代码来分析php json响应:PHP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<script
  src="https://code.jquery.com/jquery-3.2.1.min.js"
  integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="
  crossorigin="anonymous">
<script type="text/javascript">  
$.ajax({
    url:'index.php',
    data:{},
    type:"POST",
    success:function(result) {
        jsondecoded = $.parseJSON(result);
        $.each(jsondecoded, function(index, value) {
            $("#servers").text($("#servers").text() +"" + value.servername);
            console.log(value.start);
            console.log(value.end);
            console.log(value.id);
        });
    },
    statusCode: {
    404: function() {
      alert("page not found" );
    }
  }
});

PHP

<预> <代码>?PHPecho'["start":"2017-08-29","end":"2017-09-01","id":"22