什么是JSON,为什么我会使用它?

时间:2008-12-20 20:19:11

标签: json

我查看了维基百科并用Google搜索并阅读了官方文档,但我仍然没有达到我真正理解JSON是什么的原因,以及为什么我会使用它。

我一直在使用PHP,MySQL和Javascript / HTML构建应用程序,如果JSON可以做些什么来让我的生活更轻松或我的代码更好或我的用户界面更好,那么我想知道它。有人可以给我一个简洁的解释吗?

17 个答案:

答案 0 :(得分:623)

JSON(JavaScript Object Notation)是一种用于数据交换的轻量级格式。它基于JavaScript语言的子集(对象在JavaScript中构建的方式)。作为stated in the MDN,某些JavaScript不是JSON,而某些JSON不是JavaScript。

使用它的一个例子是Web服务响应。在过去的“旧”时代,Web服务使用XML作为传输数据的主要数据格式,但由于JSON出现( JSON格式由Douglas Crockford在RFC 4627中指定),一直是首选格式,因为它更加轻量级

您可以在官方JSON web site找到更多信息。

JSON基于两种结构:

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

JSON结构



JSON Object diagram

JSON Array diagram

JSON Value diagram

JSON String diagram

JSON Number diagram

以下是JSON数据的示例:

{
     "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 object Vs JSON


使用JSON和JavaScript时,您可能会尝试使用eval函数来评估回调中返回的结果,但由于有两个字符(U + 2028& U +),因此不建议这样做。 2029)在JSON中有效但​​在JavaScript中无效(阅读更多此here)。

因此,在评估之前,必须始终尝试使用Crockford的脚本来检查有效的JSON。找到脚本解释的链接here,这里是js文件的direct link。现在每个主流浏览器都有its own implementation

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

//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格式的字符串。当您希望将数据发送回服务器时,这非常有用:

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)也采用第二个参数,该函数将在最终结果的每个级别为每个键和值调用一个函数,并且每个值将被输入的函数的结果替换。 (更多关于此here

顺便说一句,对于那些认为JSON仅适用于JavaScript的人,请查看this post解释并确认其他内容。


参考

答案 1 :(得分:50)

以上所有答案都集中在具体细节上。因此,我将尝试解释概念,以便您能够理解上述内容。

什么是JSON? - 我如何向妻子解释 TM

我:“这基本上是一种以书面形式与某人沟通的方式....但是有规则。

妻子:是的....?

我:让我们以英语为例:我们有规则 - 句号,逗号,括号,连字符,撇号等,它们都意味着不同的东西。基本上我们都同意完全停止意味着什么(即我们在阅读时就应该暂停)。

妻子:你是说JSON是一种向某人写英文的方式,但它有双方同意的规则?

我:完全正确!除了这些规则是非常具体的。在平淡无奇的英语中,规则非常宽松:就像笼子战斗一样:你可以做任何你想做的事情,除了一些基础知识(例如眼睛刨削)。例如,如果我想告诉美国国税局关于我们的家庭,我可以使用平淡无奇的英语来做一些不同的事情。注意每种方式的差异:

我:

•示例1:我们的家庭有4个人:你,我和2个孩子。

•示例2:我们的家人:你,我,孩子1和孩子2。

•示例3:家庭:[你,我,孩子1,孩子2]

•示例4:我们家中有4个人:妈妈,爸爸,小孩1和小孩2。

妻子:好的,我明白了。你可以用英语用不同的方式说同样的话。你可以在这里和那里添加一些单词,这里和那里有一些逗号,每个人都会理解。

我:完全正确。除JSON外,规则非常严格。您只能以某种方式进行沟通。而且你必须遵循这些规则让其他人理解它:括号,某些地方的逗号。

妻子:他们为什么不使用普通英语?

我:他们愿意,但请记住我们正在处理电脑问题。计算机是愚蠢的,无法理解句子。因此,当涉及计算机时我们必须非常具体,否则他们会感到困惑。此外,JSON是一种相当有效的通信方式,因此大多数不相关的东西都被删除了,这很有用。如果你想把我们的家人和计算机联系起来,你可以这样做的一种方式就是这样:

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

......那基本上就是JSON。但请记住,您必须遵守JSON语法规则。如果你打破这些规则,那么计算机根本就不会理解(即解析)你正在写的东西。

妻子:那我该怎么写Json?

我:请阅读上述答案以了解具体信息。简而言之,您不得不使用键值对和数组进行通信。

<强>摘要

  

JSON基本上是一种通过非常非常具体的规则向某人传达数据的方式。

答案 2 :(得分:48)

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

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中为各种编程语言序列化和反序列化对象。

答案 3 :(得分:31)

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

语法是JavaScript中使用的,JSON本身代表“JavaScript Object Notation”。但它已经变得可移植,并且也用于其他语言。

详细信息的有用链接在这里:

http://secretgeek.net/json_3mins.asp

答案 4 :(得分:18)

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

答案 5 :(得分:16)

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

答案 6 :(得分:11)

常见的简答是:如果您使用AJAX发出数据请求,则可以轻松地将对象作为JSON字符串发送和返回。 Javascript支持toJSON()的可用扩展调用所有javascript类型,用于在AJAX请求中向服务器发送数据。 AJAX响应可以将对象作为JSON字符串返回,可以通过简单的eval调用将其转换为Javascript对象,例如:如果AJAX函数someAjaxFunctionCallReturningJson返回

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

你可以用Javascript写作

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

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

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

答案 7 :(得分:8)

我喜欢JSON,主要是因为它非常简洁。对于可以被gzip压缩的网页内容,这不一定是一个大问题(因此 x html如此受欢迎)。但有时这可能是有益的。

例如,对于一个项目,我正在传输需要序列化并通过XMPP传输的信息。由于大多数服务器将限制您可以在单个消息中传输的数据量,因此我发现使用JSON比显而易见的替代XML更有帮助。

作为一个额外的好处,如果您熟悉Python或Javascript,您已经非常了解JSON并且可以在没有经过多少培训的情况下解释它。

答案 8 :(得分:8)

什么是JSON?

JavaScript Object Notation(JSON)是一种轻量级数据交换格式,受JavaScript的对象文字的启发。

JSON值可以包含:

对象(名称 - 值对的集合)   数组(有序的值列表)   字符串(双引号)   数字   true,false或null

JSON与语言无关。

使用PHP的JSON?

在PHP V5.2.0之后,JSON扩展被解码并将功能编码为默认值。

Json_encode - 返回值的JSON表示 Json_decode - 解码JSON字符串 Json_last_error - 返回发生的最后一个错误。

JSON语法和规则?

JSON语法源自JavaScript对象表示法语法:

数据是名称/值对 数据以逗号分隔 卷曲的大括号可以容纳物体 方括号包含数组

答案 9 :(得分:4)

我们必须在大学做一个项目,我们面临一个非常大的问题,它被称为同源政策。另外,它使得来自Javascript的XMLHttpRequest方法无法向您网站所在的域以外的域发出请求。

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

这是实用的:Yahoo JSON

答案 10 :(得分:4)

JSON和传统语法之间的区别如下(在Javascript中)

<强>传统

 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","mike.Anderson@office.com");

使用JSON

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

  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':'mike.adnersone@office.com'});

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

所以下面的这一行是用JSON做事的方式(只是一种定义事物的简单方法)

 var Emp = new Employee({'name':'Mike', 'Id':'123', 'Phone':'23792747', 'email':'mike.adnersone@office.com'});

答案 11 :(得分:2)

这很简单。 JSON代表Java Script Object Notation。可以将其视为使用XML在软件组件之间传输数据的替代方法。

例如,我最近编写了一堆返回JSON的Web服务,然后一些Javascript开发人员编写了调用服务并使用该格式返回的信息的代码。

答案 12 :(得分:2)

JSON(Javascript对象表示法)是一种用于数据交换/传输的轻量级数据格式。它是JavaScript中的键值对。 对于REST API,它广泛用于从服务器到客户端的数据传输。如今许多社交媒体网站都在使用它。虽然我没有看到它在数据类型方面与XML一样健壮。 XML具有非常丰富的数据类型和XSD。 JSON在这方面有点缺乏。

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

答案 13 :(得分:2)

有时在没有要求的情况下提供技术性,虽然许多最高投票的答案都是准确的技术和具体的,但我个人认为它们更容易理解或简洁,因为它们可以找到在维基百科或官方文档中。

我喜欢JSON的方式就是它 - 一种不同语言世界中的语言。但是,JSON和其他语言之间的区别在于&#34;每个人&#34; &#34;讲&#34; JSON,以及他们的&#34;母语。&#34;

使用现实世界的例子,让我们假设我们有三个人。一个人说伊博语是他们的母语。第二个人想与第一个人互动,但是,第一个人说约鲁巴语是他们的第一语言。

我们能做什么?

值得庆幸的是,在我们的例子中,第三个人说英语,但也恰好说两个 Igbo和Yoruba作为第二语言,因此可以充当前两个人之间的中间人。 / p>

在编程世界中,第一个&#34; person&#34;是Python,第二个&#34; person&#34;是Ruby,第三个人是&#34;是JSON,恰好能够&#34;翻译&#34; Ruby变成Python,反之亦然!现在很明显,这个比喻并不是一个完美的类比,但是,作为一个双语的人,我相信这是一种了解JSON如何与其他编程语言交互的简单方法。

答案 14 :(得分:0)

在Java上下文中,可能要使用JSON的一个原因是,它为Java的序列化框架提供了一个很好的替代方法,而Java的序列化框架已经(历来证明)存在一些相当严重的漏洞。

约书亚·布洛赫(Joshua Bloch)在第85条“更喜欢Java序列化的替代方法”(有效的Java第三版)中对此进行了深入的讨论。

Java的序列化最初旨在将数据结构转换为易于传输或存储的格式。 JSON满足了此要求,而没有上面提到的严重漏洞。

答案 15 :(得分:0)

了解JSON

JSON只是大多数REST API用于返回其数据的一种文本格式。另一个常见格式是XML,但是XML较为冗长。

这是JSON的一个小例子:

// JSON object
{
  "name": "John",
  "age": 20
}

// JSON array
[
  {
    "name": "John",
    "age": 20
  },
  {
    "name": "Peter",
    "age": 22
  }
]

请注意,该代码段以括号{开头,表示对象。 JSON也可以从数组开始,该数组使用方括号[符号表示数组的开始。 JSON需要正确格式化,因此所有开始的{[符号都必须具有其结束符号:}]

JSON可以包含对象或数组。 JSON中的对象包装在括号{ … }中,而数组包装在方括号[ … ]中。

JSON通过键值构造数据。 键始终是字符串,但是值可以是任何值(字符串,数字,JSON对象,JSON数组...)。这将影响我们在后续步骤中解析JSON的方式。

答案 16 :(得分:-3)

尝试使用以下代码来解析php json响应: read.php

<script
  src="https://code.jquery.com/jquery-3.2.1.min.js"
  integrity="sha256-hwg4gsxgFZhOsEEamdOYGBf13FyQuiTwlAQgxVSNgt4="
  crossorigin="anonymous"></script>
<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" );
    }
  }
});
</script>

server.php

<?php 
echo '[{"start":"2017-08-29","end":"2017-09-01","id":"22"},{"start":"2017-09-03","end":"2017-09-06","id":"23"}]';
?>