java代码里的JSON格式怎么写好看_JSON 解码

写这篇的源头是: 上司问我json解码你会么?

in fact 之前只接触过几次,所以去细致总结了一波6f4764053199e0da4d50e8a9f0572b3c.png

JSON (JavaScript Object Notation) 一种轻量级的数据交换格式; 嗯不要走,小编不只是无情的复制概念的机器哈哈

目录

json包含类型

json简单编写

爬虫json获得及处理

python json 库讲解

a4a96bb09e7819c0243dfb749907886f.gif  

json支持啥?

e81a95f436a6b65fdd9d607e3bf2e107.png

ps :作图工具Xmind

a4a96bb09e7819c0243dfb749907886f.gif

python 简单编写

看起来像是python里类型的大杂烩,json的格式像是python的字典感觉,我们会联想到用{}  / , / : 那我们模仿字典的格式自己试着写一个包含以上所有类型的简单json

{  "number": 123,   "string": "first json",   "boolean": true, l  "array": [11,12,13],   "object": {            "ok": "fine",            "judge": "good",            "you":"me" },    "null": null }

然后用个json在线编辑器去核验

http://www.bejson.com/jsoneditoronline/

结果如下: OK了

f0fb08a9a210f9f5c5fce450178c0557.png

以上只是为了让大家熟悉或者复习一下json的简单形式


强调

json里只能有双引号,字典里可单可双

json里的键,都是字符串格式

a4a96bb09e7819c0243dfb749907886f.gif

爬虫Json实例

很多时候我们拿到的数据是json格式,比如第三方给的,比如爬虫得到的混乱数据

我们拿Mac pro电脑的评论来看json文件 (其实是小编想换电脑了)

步骤:

1.获取评论真实链接

打开京东里Mac pro的评价

右键点击最下面inspect element 

9843eaf427dbd259416c30d0c5e89efd.png

2. 找到对应的json文件

出现的界面正好是上面点击的结果(全部评价)

3e96e6b03094d3f99ed16d8ddbe53688.png

点击菜单栏里的network-点击JS

发现左边都是JS文件,找到对应的comments文件

点击右边的preview:哈哈 这样看着舒服多了

f27a8709d105d1000ba91137da8be498.png

点击preview右边的headers:发现了真实的url

65f0fa4730b505b1f380e0ded6974528.png

3.基本的爬虫

url='https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100006729770&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1'r = requests.get(url)r.status_codetext = r.texttext

结果太多我不全部粘贴

b874e382267dc9182a19c61a78dd7d05.png

4.处理成正确的json格式

  • 方法1: json在线编辑器

  • 方法2:正则表达式

方法1: 

粘贴所有爬到的内容到我推荐过的网站

https://www.bejson.com

粘贴到方框内,根据提示改错:我们删去了开头的 'fetchJSON_comment98(, 和结尾的)';点击格式化校验:结果如下:(粘贴两个片段)

bdc167d6653b3ce8a4a43fd096b4bdc3.png55857cfe8967e30766dc93a7377d82a7.png

保存json文件 , 用json.loads(文件) 转换成python的格式就可以直接提取啦,这里应该是像你提取字典里内容一样(具体python在下面讲解)

方法二:正则匹配

目标提取text里guid,content,creationTime, isDelete 和isTop的信息

guid = re.findall('\"guid\":.*?(?=,)',r.text)content = re.findall('\"content\":.*?(?=,)',r.text)creationTime=re.findall('\"creationTime\":.*?(?=,)',r.text)isDelete =re.findall('\"isDelete\":.*?(?=,)',r.text)isTop = re.findall('\"isTop\":.*?(?=,)',r.text)

0045dccd9b419daaeb299d31a218a424.png


a4a96bb09e7819c0243dfb749907886f.gif

Package Json

官方文档:

https://docs.python.org/3/library/json.html

主要功能

loads()方法把字符串转换成数据类型

load()方法把文件打开从字符串转换成数据类型

dumps()方法把数据类型转换成字符串 。

dump()方法把数据类型转换成字符串并存储在文件中

loads & load

loads 传入字符串,load传入文件

json.loads(s*cls=Noneobject_hook=Noneparse_float=Noneparse_int=Noneparse_constant=Noneobject_pairs_hook=None**kw)

使用 loads 将(包含JSON文档的str、bytes或bytearray实例)反序列化转换到Python对象。如果反序列化的数据不是有效的JSON文档,则会引发JSONDecodeError错误。

错误

31d6d43383f67abb78c2f108057ba31d.png

loads转化字符

b63809209d5a3a69e925b211a5ab06d6.png

当我们把之前写的json用loads转换成python对象

  • 类型从原来的str变成了dict

    (因为原本字符串引号里面就是字典)

  • 双引号变成了单引号

  • 用python里dict的处理方式就好

load打开文件

我们用上一块json在线编辑器里保存的文件, 保存在桌面的mac.txt文档

c272dd9b0f9327a6b17889e0beb77f90.png

然后用字典的方式处理吧

dumps & dump

json.dumps(obj*skipkeys=Falseensure_ascii=Truecheck_circular=Trueallow_nan=Truecls=Noneindent=Noneseparators=Nonedefault=Nonesort_keys=False**kw)

json.dump(objfp*skipkeys=Falseensure_ascii=Truecheck_circular=Trueallow_nan=Truecls=Noneindent=Noneseparators=Nonedefault=Nonesort_keys=False**kw)

发现只有 * 和fp不一样

因为dumps - 编码传入字符串,dump传入文件

dumps简单示例

271d64a1327da8a3b98db5a48cb71eb4.png

-----------------------------------------------------------------

参数(以下从官网翻译过来)

跳过吧哈哈我也不想看

后面的例子只用到了indent缩进作用,和sortkey键排序作用

  • 如果indent是一个非负整数或字符串,那么JSON数组元素和对象成员将使用缩进级别进行漂亮的打印。缩进级别为0、负数或" "只会插入新行。None(默认值)选择最紧凑的表示。使用一个正整数缩进每个级别的空格数。如果缩进是一个字符串(例如“\t”),该字符串用于缩进每个级别。

  • 如果sort_keys为真(默认值:False),那么字典的输出将按键排序。

    ———————看与不看分割线————————

  • 如果skipkeys为真(默认值:False),那么不属于基本类型(str、int、float、bool、None)的dict键将被跳过,而不会引发类型错误。

  • 如果ensure_ascii为真(默认值),则保证输出将转义所有传入的非ascii字符; 如果ensure_ascii为假,这些字符将按原样输出。

  • 如果check_circular为false(默认值:True),那么将跳过对容器类型的循环引用检查,而循环引用将导致溢出错误(或者更糟)。

  • 如果allow_nan为false(默认值:True),则在严格遵循JSON规范的情况下序列化超出范围的浮点值(nan、inf、-inf)将是一个ValueError。如果allow_nan为真,将使用它们的JavaScript等价值(NaN、Infinity、-Infinity)。

  • 如果指定,separators应该是一个(item_separator, key_separator)元组。如果缩进为None,那么默认值是(',',':'),否则为(',',':')。要获得最紧凑的JSON表示,应该指定(',',':')来消除空白。

    - 在3.4版本中更改:如果缩进不为空,使用(',',':')作为默认值。

    - 如果指定了默认值,则默认值应该是一个为无法序列化的对象调用的函数。它应该返回一个JSON可编码版本的对象或引发一个类型错误。如果未指定,则引发类型错误。

------------------------------------------------------------------

嗯真的好枯燥,我们暂时不考虑编码,我们用一下indent 和sort_keys举个例子,一个使用缩进,一个使用缩进和键排序,使得我们将python 语句转化成json时变得很好看。

b49ee2e97bb2a8c5df4386219b53f9b2.pngb2e78e273c98eb1b0ffabd6b9e0c5135.png

第二个图既有缩进又按照键adefm的顺序排序了

代码可以直接食用

基本的就是这样啦

eadb1b01953e922599a0eaeaf8030b1f.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值