原标题:程序员都应该了解的一种数据格式之 JSON

作者 | 猪哥

责编 | maozz

JSON的诞生原因是因为XML整合到HTML中各个浏览器实现的细节不尽相同,所以道格拉斯·克罗克福特(Douglas Crockford) 和 奇普·莫宁斯达(Chip Morningstar)一起从JS的数据类型中提取了一个子集,作为新的数据交换格式,因为主流的浏览器使用了通用的Java引擎组件,所以在解析这种新数据格式时就不存在兼容性问题,于是他们将这种数据格式命名为 “Java Object Notation”,缩写为 JSON,由此JSON便诞生了!

今天我们来学习一下JSON的结构形式、数据类型、使用场景以及注意事项吧!

JSON格式

上面我们知道JSON是从Java的数据类型中提取出来的子集,那JSON有几种结构形式呢?又有哪些数据类型呢?他们又分别对应着Java中的哪些数据类型呢?

JSON的2种结构形式,键值对形式和数组形式。

举了一个JSON的实例,就是键值对形式的,如下:

{

"person": {

"name": "pig",

"age": "18",

"sex": "man",

"hometown": {

"province": "江西省",

"city": "抚州市",

"county": "崇仁县"

}

}

}

这种结构的JSON数据规则是:一个无序的“‘名称/值’对”集合。一个对象以 {左括号 开始, }右括号 结束。每个“名称”后跟一个 :冒号 ;“‘名称/值’ 对”之间使用 ,逗号 分隔。

因为大多数的时候大家用的JSON可能都是上面那种key-value形式,所以很多人在讲解JSON的时候总是会忽略数组形式,这一点是需要注意的。

那JSON的数组形式是怎么样的呢?举一个实例吧!

[ "pig", 18, "man", "江西省抚州市崇仁县"]

数组形式的JSON数据就是值(value)的有序集合。一个数组以 [左中括号 开始, ]右中括号 结束。值之间使用 ,逗号 分隔。

JOSN的6种数据类型

上面两种JSON形式内部都是包含value的,那JSON的value到底有哪些类型,而且上期我们说JSON其实就是从Js数据格式中提取了一个子集,那具体有哪几种数据类型呢?

string:字符串,必须要用双引号引起来。

number:数值,与Java的number一致,整数(不使用小数点或指数计数法)最多为 15 位,小数的最大位数是 17。

object:Java的对象形式,{ key:value }表示方式,可嵌套。

array:数组,Java的Array表示方式[ value ],可嵌套。

true/false:布尔类型,Java的boolean类型。

null:空值,Java的null。

以上数据形式图片来源JSON官方文档:http://www.json.org/json-zh.html

JSON使用场景

介绍完JSON的数据格式,那我们来看看JSON在企业中使用的比较多的场景。

接口返回数据 和序列化。JSON用的最多的地方莫过于Web了,现在的数据接口基本上都是返回的JSON,具体细化的场景有:

Ajxa异步访问数据

RPC远程调用

前后端分离后端返回的数据

开放API,如百度、高德等一些开放接口

企业间合作接口

这种API接口一般都会提供一个接口文档,说明接口的入参、出参等,

一般的接口返回数据都会封装成JSON格式,比如类似下面这种

{

"code": 1,

"msg": "success",

"data": {

"name": "pig",

"age": "18",

"sex": "man",

"hometown": {

"province": "江西省",

"city": "抚州市",

"county": "崇仁县"

}

}

}

程序在运行时所有的变量都是保存在内存当中的,如果出现程序重启或者机器宕机的情况,那这些数据就丢失了。一般情况运行时变量并不是那么重要丢了就丢了,但有些内存中的数据是需要保存起来供下次程序或者其他程序使用。

保存内存中的数据要么保存在数据库,要么保存直接到文件中,而将内存中的数据变成可保存或可传输的数据的过程叫做序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思。

正常的序列化是将编程语言中的对象直接转成可保存或可传输的,这样会保存对象的类型信息,而JSON序列化则不会保留对象类型!

为了让大家更直观的感受区别,猪哥用代码做一个测试,大家一目了然

Python对象直接序列化会保存class信息,下次使用loads加载到内存时直接变成Python对象。

JSON对象序列化只保存属性数据,不保留class信息,下次使用loads加载到内存可以直接转成dict对象,当然也可以转为Person对象,但是需要写辅助方法。

对于JSON序列化不能保存class信息的特点,那JSON序列化还有什么用?答案是当然有用,对于不同编程语言序列化读取有用,比如:我用Python爬取数据然后转成对象,现在我需要将它序列化磁盘,然后使用Java语言读取这份数据,这个时候由于跨语言数据类型不同,所以就需要用到JSON序列化。

存在即合理,两种序列化可根据需求自行选择!

最后就是生成Token和 配置文件

首先声明Token的形式多种多样,有JSON、字符串、数字等等,只要能满足需求即可,没有规定用哪种形式。

JSON格式的Token最有代表性的莫过于JWT(JSON Web Tokens)。

随着技术的发展,分布式web应用的普及,通过Session管理用户登录状态成本越来越高,因此慢慢发展成为Token的方式做登录身份校验,然后通过Token去取Redis中的缓存的用户信息,随着之后JWT的出现,校验方式更加简单便捷化,无需通过Redis缓存,而是直接根据Token取出保存的用户信息,以及对Token可用性校验,单点登录更为简单。

使用JWT做过app的登录系统,大概的流程就是:

用户输入用户名密码

app请求登录中心验证用户名密码

如果验证通过则生成一个Token,其中Token中包含:

用户的uid、Token过期时间、过期延期时间等,然后返回给app

app获得Token,保存在cookie中,下次请求其他服务则带上

其他服务获取到Token之后调用登录中心接口验证

验证通过则响应

JWT登录认证有哪些优势:

性能好:服务器不需要保存大量的session

单点登录(登录一个应用,同一个企业的其他应用都可以访问):使用JWT做一个登录中心基本搞定,很容易实现。

兼容性好:支持移动设备,支持跨程序调用,Cookie 是不允许垮域访问的,而 Token 则不存在这个问题。

安全性好:因为有签名,所以JWT可以防止被篡改。更多JWT相关知识自行在网上学习,本文不过多介绍!

说实话JSON作为配置文件使用场景并不多,最具代表性的就是npm的package.json包管理配置文件了,下面就是一个npm的package.json配置文件内容。

{

"name": "server", //项目名称

"version": "0.0.0",

"private": true,

"main": "server.js", //项目入口地址,即执行npm后会执行的项目

"s": {

"start": "node ./bin/www"///s指定了运行脚本命令的npm命令行缩写

},

"dependencies": {

"cookie-parser": "~1.4.3", //指定项目开发所需的模块

"debug": "~2.6.9",

"express": "~4.16.0",

"http-errors": "~1.6.2",

"jade": "~1.11.0",

"morgan": "~1.9.0"

}

}

但其实JSON并不合适做配置文件,因为它不能写注释、作为配置文件的可读性差等原因。

配置文件的格式有很多种如:toml、yaml、xml、ini等,目前很多地方开始使用yaml作为配置文件格式。

JSON在Python中的使用

最后我们来看看Python中操作JSON的常用方法有哪些,在Python中操作JSON时需要引入json标准库。

importjson

类型转换

Python类型转JSON:json.dump

# 1、Python的dict类型转JSON

person_dict = { 'name': 'pig', 'age': 18, 'sex': 'man', 'hometown': '江西抚州'}

# indent参数为缩进空格数

person_dict_json = json.dumps(person_dict, indent= 4)

print(person_dict_json, 'n')

# 2、Python的列表类型转JSON

person_list = [ 'pig', 18, 'man', '江西抚州']

person_list_json = json.dumps(person_list)

print(person_list_json, 'n')

# 3、Python的对象类型转JSON

person_obj = Person( 'pig', 18, 'man', '江西抚州')

# 中间的匿名函数是获得对象所有属性的字典形式

person_obj_json = json.dumps(person_obj, default=lambda obj: obj.__dict__, indent= 4)

print(person_obj_json, 'n')

执行结果:

JSON转Python类型:json.loads

# 4、JSON转Python的dict类型

person_json = '{ "name": "pig", "age": 18, "sex": "man", "hometown": "江西抚州"}'

person_json_dict = json.loads(person_json)

print(type(person_json_dict), 'n')

# 5、JSON转Python的列表类型

person_json2 = '[ "pig", 18, "man", "江西抚州"]'

person_json_list = json.loads(person_json2)

print(type(person_json_list), 'n')

# 6、JSON转Python的自定义对象类型

person_json = '{ "name": "pig", "age": 18, "sex": "man", "hometown": "江西抚州"}'

# object_hook参数是将dict对象转成自定义对象

person_json_obj = json.loads(person_json, object_hook=lambda d: Person(d['name'], d['age'], d['sex'], d['hometown']))

print(type(person_json_obj), 'n')

执行结果如下:

对应的数据类型

上面我们演示了Python类型与JSON的相互转换,最开始的时候我们讲过JSON有6种数据类型,那这6种数据类型分别对应Python中的哪些数据类型呢?

需要注意的点

JSON的键名和字符串都必须使用双引号引起来,而Python中单引号也可以表示为字符串,所以这是个比较容易犯的错误!

Python类型与JSON相互转换的时候到底是用load/dump还是用loadsdumps?

他们之间有什么区别?

什么时候该加s什么时候不该加s?

这个我们可以通过查看源码找到答案:

不加s的方法入参多了一个fp表示filepath,最后多了一个写入文件的操作。

所以我们在记忆的时候可以这样记忆:

加s表示转成字符串(str),不加s表示转成文件。

Python自定义对象与JSON相互转换的时候需要辅助方法来指明属性与键名的对应关系,如果不指定一个方法则会抛出异常!

相信有些看的仔细的同学会好奇上面使用json.dumps方法将Python类型转JSON的时候,如果出现中文,则会出现:

u6c5fu897fu629au5dde

这种东西,这是为什么呢?

原因是:Python 3中的json在做dumps操作时,会将中文转换成unicode编码,并以16进制方式存储,而并不是UTF-8格式!

总结

今天我们学习了JSON的2种形式,切记JSON还有[...]这种形式的。

学习了JSON的6种数据类型他们分别对于Python中的哪些类型。

了解了JSON的一些使用场景以及实际的例子。

还学习了在Python中如何使用JSON以及需要注意的事项。

一个JSON知识点却分两篇长文(近万字)来讲,其重要性不言而喻。因为不管你是做爬虫、还是做数据分析、web、甚至前端、测试、运维,JSON都是你必须要掌握的一个知识点

本文为作者投稿,版权归作者个人所有。

点击阅读原文, 即刻参加调查!返回搜狐,查看更多

责任编辑:

json java 数据类型_程序员都应该了解的一种数据格式之 JSON相关推荐

  1. 程序员都应该了解的一种数据格式之 JSON

    作者 | 猪哥 责编 | maozz JSON的诞生原因是因为XML整合到HTML中各个浏览器实现的细节不尽相同,所以道格拉斯·克罗克福特(Douglas Crockford) 和 奇普·莫宁斯达(C ...

  2. javascript技术教程蔡敏_程序员都必掌握的前端教程之JavaScript基础教程(上)

    阅读本文约需要10分钟,您可以先关注我们,避免下次无法找到. 本篇文章成哥继续带大家来学习前端教程之JavaScript,网页的动态事件基本上都是靠它来实现的.下面我们就一起来学习内容吧! 01 Ja ...

  3. scala语言的底层是java实现的_2020了,每个程序员都该学习的 5 种开发语言

    我曾在某处读到过(可能在<代码大全>,但我不敢确定),程序员应该每年学习一门新的编程语言.但如果做不到,我建议,你至少学习以下 5 种开发语言,以便你在职业生涯有很好的表现. 每个公司都喜 ...

  4. java情人节_程序员也是有情怀的!情人节看程序员如何告白

    一年一度的情人节又来了,我们程序员也是有情怀,懂浪漫的,富有理想主义的一个族群,智商超越常人,当人表白的方式也是普通人难以学习的. 记得某年圣诞节上,西班牙程序员Roman Cortes带来了用纯ja ...

  5. 程序员的梗_程序员都背着大书包,里面到底装的什么?程序员们:钱、电脑.....

    程序员的典型形象是什么?大概就是穿着格子衫.背着大书包的形象吧? 不明白为什么程序员都喜欢背着大书包,一位网友发出灵魂拷问:地铁上的程序员都背着大书包,里面到底装的什么? 程序员们翻了翻自己的大书包, ...

  6. 佛祖保佑代码无bug图片_程序员都有哪些奇趣的代码注释,细思极恐

    在很多不熟悉程序员的群体中,可能都认为程序员是沉闷一次的代表,但其实不然,很多程序员都是非常幽默有趣且都有一颗非常闷骚的心.这尤其体现在他们呢好玩的代码注释上面,我找了一写奇趣的代码注释类型,小伙伴们 ...

  7. 为啥有人说每个程序员都应该这学习5种编程语言?

    1.Java Java是过去20年中最流行的语言之一,它控制着服务器端应用程序开发的世界.它还在使用Android的移动游戏和应用程序开发以及企业Web开发领域占有相当大的市场份额. Java是从WO ...

  8. 每个程序员都应该学习的 6 种数据结构

    数据结构和算法是编程的支柱,这里有6个Java程序员应该学习的基本数据结构 扫码关注<Java学研大本营>,加入读者群,分享更多精彩 数据结构是程序的构建块.甚至有人说"数据结构 ...

  9. 每个程序员都该学习的5种开发语言

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文出处:https://dzone.com/articles/5-programming-language ...

最新文章

  1. 大数据最清楚王宝强离婚事件到底有多热!
  2. 论网站更新与seo优化的关系
  3. 矩形内接任意多边形抠图(可以羽化边缘)
  4. [工具]Tomcat CVE-2017-12615 远程代码执行
  5. POJ2891 Strange Way to Express Integers【扩展中国剩余定理】
  6. SQLServer转义问题
  7. gcovr 安装_Kudu 1.8.0 编译安装配置
  8. echarts 地图 dispatchaction不好使_数据分析帝:广东省客户数量地图展示,如何通过python实现?...
  9. 有些人总是在进步,因为他随时懂得回溯、调试、纠错,进而提升自己
  10. error LNK2019 无法解析的外部符号 _WinMain@16,该符号在函数 “int __cdecl invoke_main(void)“
  11. 八皇后(N皇后)问题
  12. int java 时间,java 时间处理类
  13. 设计模式(14)——原型模式(Prototype)
  14. I2C总线协议详解(特点、通信过程、典型I2C时序)
  15. 论文 查重 知网 万方 paperpass
  16. 三菱FX1S PLC控制伺服电机小结
  17. 操作系统核心与驱动程序
  18. 阿里医疗NLP实践与思考
  19. 快手、携程等公司转战到 ClickHouse,ES 难道不行了?
  20. linkMap深度解析

热门文章

  1. java 检测表情符号_一个能在字符串中识别出 Emoji 的简单工具 (支持JavaScript和Java)...
  2. SQL优化理解的一点方法
  3. 性能测试培训: 监控CPU之python
  4. 基于JFinal的开源博客系统JFinal_Blog1.1版本发布
  5. Android 报错:Conversion to Dalvik format failed: ...
  6. 通用高性能 Windows Socket 组件 HP-Socket v2.2.1(增加 PULL 模型支持)
  7. UVA 10624 Super Number
  8. scrapy-redis源码解析
  9. oracle批处理还原数据库,用批处理写的:数据库备份还原工具(修正加强版)
  10. Web前端——HTML