我查看了 Wikipedia 并在 Google 上搜索并阅读了官方文档,但我仍然没有真正理解 JSON 是什么,以及我为什么要使用它。
我一直在使用 PHP、MySQL 和 JavaScript / HTML 构建应用程序,如果 JSON 可以做一些事情来让我的生活更轻松,或者我的代码更好,或者我的用户界面更好,那么我想知道它。有人可以给我一个简洁的解释吗?
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结构
https://i.stack.imgur.com/VHjrV.gif
以下是 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。
使用 JSON 和 JavaScript 时,您可能想使用 eval
函数来评估回调中返回的结果,但不建议这样做,因为 JSON 中有两个有效字符(U+2028 和 U+2029)但不是在 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}
上述两个方法(parse
和 stringify
)还带了一个第二个参数,这是一个函数,在最终结果的每一层,每个键和值都会被调用,每个值都会被你的结果替换输入函数。 (有关此 here 的更多信息)
顺便说一句,对于那些认为 JSON 仅适用于 JavaScript 的所有人,请查看 this post,它解释并确认了其他情况。
参考
JSON.org
维基百科
分钟内的 Json(感谢 mson)
在 Yahoo! 中使用 JSON Web 服务(感谢 gljivar)
JSON 到 CSV 转换器
替代 JSON 到 CSV 转换器
JSON Lint(JSON 验证器)
概念解释 - 没有代码或技术术语
什么是 JSON? – 我是如何向我的妻子解释的
我:“这基本上是一种以书面形式与某人交流的方式……但有非常具体的规则。
妻子:是吗……?
我:在平淡无奇的英语中,规则很宽松:就像笼子里的格斗一样。 JSON 并非如此。描述事物的方式有很多种:
• 示例1:我们家有4 口人:你、我和2 个孩子。
• 示例2:我们的家庭:你、我、kid1 和kid2。
• 示例 3:家庭:[你,我,孩子 1,孩子 2]
• 示例4:我们家有4 口人:妈妈、爸爸、孩子1 和孩子2。
妻子:他们为什么不直接用简单的英语呢?
我:他们会,但请记住我们正在处理计算机。计算机是愚蠢的,无法理解句子。因此,当涉及计算机时,我们必须非常具体,否则他们会感到困惑。此外,JSON 是一种相当有效的通信方式,因此大部分不相关的东西都被删除了,这很方便。如果您想将我们的家人与计算机通信,您可以这样做的一种方法是:
{
"Family": ["Me", "Wife", "Kid1", "Kid2"]
}
……这基本上是 JSON。但请记住,您必须遵守 JSON 语法规则。如果您违反了这些规则,那么计算机将根本无法理解(即解析)您正在编写的内容。
老婆:那我怎么用Json写呢?
一个好方法是使用 json 序列化器 - 这是一个为您完成繁重工作的库。
概括
JSON 基本上是一种向某人传达数据的方式,具有非常非常具体的规则。使用键值对和数组。这是解释的概念,此时值得阅读上面的具体规则。
简而言之 - 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 中的对象。
简而言之,它是一种用于传递数据的脚本符号。在某些方面是 XML 的替代方案,本机支持基本数据类型、数组和关联数组(名称-值对,称为对象,因为它们代表的是对象)。
语法是 JavaScript 中使用的语法,JSON 本身代表“JavaScript Object Notation”。然而,它已经变得可移植并且也用于其他语言。
一个有用的详细链接在这里:
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 返回
"{ \"FirstName\" : \"Fred\", \"LastName\" : \"Flintstone\" }"
你可以用 Javascript 编写
var obj = eval("(" + someAjaxFunctionCallReturningJson().value + ")");
alert(obj.FirstName);
alert(obj.LastName);
JSON 也可用于 Web 服务有效负载等,但对于 AJAX 结果来说真的很方便。
更新(十年后):不要这样做,使用 JSON.parse
我喜欢 JSON 主要是因为它非常简洁。对于可以 gzip 压缩的 Web 内容,这不一定是什么大问题(这就是为什么 xhtml 如此受欢迎)。但在某些情况下,这可能是有益的。
例如,对于一个项目,我正在传输需要序列化并通过 XMPP 传输的信息。由于大多数服务器会限制您可以在单个消息中传输的数据量,因此我发现使用 JSON 比使用明显的替代方案 XML 更有帮助。
另外,如果您熟悉 Python 或 Javascript,那么您已经非常了解 JSON,并且无需太多培训即可解释它。
什么是 JSON?
JavaScript Object Notation (JSON) 是一种轻量级的数据交换格式,其灵感来自 JavaScript 的对象文字。
JSON 值可以包括:
对象(名称-值对的集合) 数组(值的有序列表) 字符串(双引号) 数字 true、false 或 null
JSON 与语言无关。
JSON 与 PHP?
PHP 版本 5.2.0 之后,JSON 扩展默认解码和编码功能。
Json_encode - 返回值的 JSON 表示 Json_decode - 解码 JSON 字符串 Json_last_error - 返回最后发生的错误。
JSON 语法和规则?
JSON 语法源自 JavaScript 对象表示法语法:
数据在名称/值对中 数据由逗号分隔 花括号保存对象 方括号保存数组
有时在不需要技术性的地方给出了技术性,虽然许多投票最多的答案都是准确的技术性和具体的,但我个人认为它们不像维基百科或在官方文档。
我喜欢考虑 JSON 的方式正是它的本质——一种不同语言世界中的语言。然而,JSON 和其他语言的区别在于“每个人”都“说”JSON,以及他们的“母语”。
使用一个真实世界的例子,让我们假设我们有三个人。一个人说伊博语作为他们的母语。第二个人想与第一个人互动,但是,第一个人说约鲁巴语作为他们的第一语言。
我们能做什么?
值得庆幸的是,我们示例中的第三个人是说英语长大的,但也恰好会说伊博语和约鲁巴语作为第二语言,因此可以充当前两个人之间的中介。
在编程世界中,第一个“人”是 Python,第二个“人”是 Ruby,第三个“人”是 JSON,恰好能够将 Ruby“翻译”成 Python,反之亦然!现在显然这个类比不是一个完美的类比,但是,作为双语的人,我相信这是了解 JSON 如何与其他编程语言交互的一种简单方法。
我们必须在大学做一个项目,我们面临一个非常大的问题,它被称为同源政策。 Amog 其他事情,它使您的 Javascript 中的 XMLHttpRequest 方法无法向您的站点所在域以外的域发出请求。
例如,如果您的网站位于 www.example.com,则您不能向 www.otherexample.com 发出请求。 JSONRequest 允许这样做,但如果该站点允许,您将获得 JSON 格式的结果(例如,它有一个以 JSON 格式返回消息的 Web 服务)。那可能是您可以使用 JSON 的一个问题。
这是一些实用的东西:Yahoo JSON
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 代表 Java 脚本对象表示法。将其视为使用 XML 在软件组件之间传输数据的替代方法。
例如,我最近编写了一堆返回 JSON 的 Web 服务,然后一些 Javascript 开发人员编写了调用这些服务并使用以该格式返回的信息的代码。
JSON(Javascript object notation)是一种用于数据交换/传输的轻量级数据格式。它与 JavaScript 一样在键值对中。对于 REST API,它广泛用于从服务器到客户端的数据传输。如今,许多社交媒体网站都在使用它。尽管在数据类型方面我认为它不像 XML 那样健壮。 XML 具有非常丰富的数据类型和 XSD。 JSON 在这方面有点欠缺。
对于相同数量的字符串数据,JSON 将比 XML 更轻,因为 XML 具有所有的开始和结束标签,等等......
在 Java 环境中,可能希望使用 JSON 的一个原因是,它为 Java 的序列化框架提供了一个非常好的替代方案,该框架已被证明(历史上)存在一些相当严重的漏洞。
Joshua Bloch 在 Item 85 “Prefer Alternatives to Java Serialization”(Effective Java 3rd Edition)中深入讨论了这一点
Java 的序列化最初旨在将数据结构转换为易于传输或存储的格式。 JSON 满足这个要求,没有上面提到的严重漏洞。
尝试以下代码来解析您的 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>
服务器.php
<?php
echo '[{"start":"2017-08-29","end":"2017-09-01","id":"22"},{"start":"2017-09-03","end":"2017-09-06","id":"23"}]';
?>