什么是 JSON,它的用途是什么?

Posted

技术标签:

【中文标题】什么是 JSON,它的用途是什么?【英文标题】:What is JSON and what is it used for? 【发布时间】:2010-09-27 21:00:37 【问题描述】:

我查看了 Wikipedia 并在 Google 上搜索并阅读了官方文档,但我仍然没有真正理解 JSON 是什么,以及我为什么要使用它。

我一直在使用 phpmysqljavascript/html 构建应用程序,如果 JSON 可以做一些事情来让我的生活更轻松,或者我的代码更好,或者我的用户界面更好,那么我想知道它.谁能给我一个简洁的解释?

【问题讨论】:

JSON 是 YAML 的子集 yaml.org copterlabs.com/blog/json-what-it-is-how-it-works-how-to-use-it 这是一个很好的直接使用示例 另请参阅 I-JSON:tbray.org/ongoing/When/201x/2015/03/23/i-json +Brad Gilbert 并非如此 - 这是它自己的数据表达方式,并且类似于 JSON,只是因为它们都将对象表达为字符串(类似于 XML 或 plist 或许多其他),但 JSON 更好用于机器编写和 YAML 用于人类编写。 【参考方案1】:

了解 JSON

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

这是 JSON 的一个小例子:

// JSON object

  "name": "John",
  "age": 20


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

请注意,sn-p 以大括号 开头,表示一个对象。 JSON 也可以作为数组开始,它使用方括号[ 符号来表示数组的开始。 JSON 需要正确格式化,所以所有以 [ 开头的符号都需要有它们的结尾符号:]

JSON 可以包含对象或数组。 JSON 中的对象包裹在大括号 内,而数组包裹在方括号 [ … ] 内。

JSON 通过键值对数据进行结构化。 键始终是字符串,但值可以是任何东西(字符串、数字、JSON 对象、JSON 数组……)。这将影响我们在接下来的步骤中解析 JSON 的方式。

【讨论】:

【参考方案2】:

概念解释 - 没有代码或技术术语

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

我:“这基本上是一种与某人进行书面交流的方式......但有非常具体的规则。

妻子:是的……?

我:在平淡无奇的英语中,规则相当宽松:就像笼子打架一样。 JSON 并非如此。描述事物的方式有很多种:

• 示例 1:我们家有 4 口人:你、我和 2 个孩子。

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

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

• 示例 4:我们家有 4 口人:妈妈、爸爸、孩子 1 和孩子 2。

妻子:他们为什么不直接使用简单的英语呢?

我:他们会,但请记住我们正在处理计算机。计算机是愚蠢的,无法理解句子。因此,当涉及计算机时,我们必须非常具体,否则他们会感到困惑。此外,JSON 是一种相当有效的通信方式,因此大部分不相关的东西都被删除了,这很方便。如果您想通过计算机与我们的家人交流,您可以这样做:


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

……那基本上是 JSON。但请记住,您必须遵守 JSON 语法规则。如果您违反了这些规则,那么计算机将无法理解(即解析)您正在编写的内容。

老婆:那我怎么用Json写呢?

一个好方法是使用 json 序列化器 - 这是一个为您完成繁重工作的库。

总结

JSON 基本上是一种向某人传达数据的方式,具有非常、非常具体的规则。使用键值对和数组。这是解释的概念,此时值得阅读上面的具体规则。

【讨论】:

【参考方案3】:

在 Java 环境中,可能希望使用 JSON 的一个原因是,它为 Java 的序列化框架提供了一个非常好的替代方案,该框架已被证明(历史上)存在一些相当严重的漏洞。

Joshua Bloch 在 Item 85 “Prefer Alternatives to Java Serialization”(Effective Java 3rd Edition)中深入讨论了这一点

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

【讨论】:

【参考方案4】:

什么是 JSON?

JavaScript Object Notation (JSON) 是一种轻量级的数据交换格式,其灵感来自 JavaScript 的对象文字。

JSON 值可以包括:

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

JSON 与语言无关。

JSON 与 PHP?

PHP 5.2.0 之后,JSON 扩展默认解码和编码功能。

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

JSON 语法和规则?

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

数据在名称/值对中 数据用逗号分隔 花括号容纳对象 方括号存放数组

【讨论】:

【参考方案5】:

常见的简短回答是:如果您使用 AJAX 进行数据请求,您可以轻松地将对象作为 JSON 字符串发送和返回。 Javascript 的可用扩展支持所有 javascript 类型的 toJSON() 调用,以便在 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

【讨论】:

使用 eval(),任何东西都会被评估。这是一个安全风险。 @ThomasWeller 是的,这个答案很古老,我现在会使用 JSON.parse,谢谢!【参考方案6】:

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 数据的示例:


     "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"'xstring 类型的对象,而不是它自己的对象。要将其转换为完全成熟的 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 解析器的示例(使用上面代码 sn-p 中的 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)还带了第二个参数,这个函数会在最终结果的每一层的每一个key和value都会被调用,每一个value都会被替换为您输入函数的结果。 (更多关于here)

顺便说一句,对于所有认为 JSON 仅适用于 JavaScript 的人,请查看 this post,它解释并确认了其他情况。


参考文献

JSON.org Wikipedia Json in 3 minutes(谢谢mson) Using JSON with Yahoo! Web Services(谢谢gljivar) JSON to CSV Converter 替代JSON to CSV Converter JSON Lint (JSON validator)

【讨论】:

不管信息是如何序列化的,你都会有一个解析器,对吧?因此,如果数据的实现细节要被抽象掉,谁在乎你使用什么格式来传输数据。 实际上,如果您在客户端和服务器之间来回传输数据,我认为注意响应大小非常重要。 对于迂腐的人来说,JSON 处理的几个字符与 JavaScript 不同,因此不能成为严格的子集:timeles-s-repo.com/json-isnt-a-javascript-subset 当您说它比 XML 更轻量级时,您是指文件大小还是轻量级在编码中具有空间意义? 那么你会用 JSON 替换 XML 吗?你是这么说的吗?如果是这样……太好了,xml 就是一场噩梦。【参考方案7】:

有时会在不需要的地方给出技术性,虽然许多获得最高投票的答案都是准确的技术性和具体的,但我个人认为它们不像***上那样容易理解或简洁,或在官方文档中。

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

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

我们能做什么?

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

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

【讨论】:

【参考方案8】:

尝试以下代码来解析您的 php json 响应: 读取.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"]';
?>

【讨论】:

虽然此代码可能会回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高​​答案的长期价值。【参考方案9】:

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

对于相同数量的字符串数据,JSON 与 XML 相比会更轻,因为 XML 具有所有的开始和结束标签等...

【讨论】:

【参考方案10】:

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');

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

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

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

【讨论】:

这不完全是 JSON - 它是一个 Javascript 对象(不是 JSON)【参考方案11】:

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

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

这里有一个有用的链接:

http://secretgeek.net/json_3mins.asp

【讨论】:

【参考方案12】:

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

【讨论】:

【参考方案13】:

这很简单。 JSON 代表 Java 脚本对象表示法。将其视为使用 XML 在软件组件之间传输数据的替代方法。

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

【讨论】:

【参考方案14】:

我们必须在大学做一个项目,我们面临一个非常大的问题,它被称为同源政策。 Amog 其他事情,它使您的 Javascript 中的 XMLHttpRequest 方法无法向您的站点所在域以外的域发出请求。

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

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

【讨论】:

【参考方案15】:

我喜欢 JSON 主要是因为它非常简洁。对于可以 gzip 压缩的 Web 内容,这不一定是什么大问题(这就是为什么 xhtml 如此受欢迎的原因)。但在某些情况下,这可能是有益的。

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

另外,如果您熟悉 Python 或 Javascript,那么您已经非常了解 JSON,并且无需太多培训即可解释它。

【讨论】:

【参考方案16】:

简而言之 - 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 中的对象进行序列化和反序列化。

【讨论】:

【参考方案17】:

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

【讨论】:

以上是关于什么是 JSON,它的用途是什么?的主要内容,如果未能解决你的问题,请参考以下文章

什么是 nuget props 文件,它的用途是什么?

什么是支持向量机(SVM)以及它的用途?

SCSI LUN id 是啥意思,它的用途是啥?

什么是 REST / RESTful 以及它的用途是什么?

什么是REST / RESTful 以及它的用途是什么?

ActivityManager中的奇怪函数:isUserAMonkey。这意味着什么,它的用途是什么?