JSON

2023-11-09

数据提取之JSON与JsonPATH

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。适用于进行数据交互的场景,比如网站前台与后台之间的数据交互。

JSON和XML的比较可谓不相上下。

Python 2.7中自带了JSON模块,直接import json就可以使用了。

官方文档:http://docs.python.org/library/json.html

Json在线解析网站:http://www.json.cn/#

JSON

json简单说就是javascript中的对象和数组,所以这两种结构就是对象和数组两种结构,通过这两种结构可以表示各种复杂的结构

  1. 对象:对象在js中表示为{ }括起来的内容,数据结构为 { key:value, key:value, ... }的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为 对象.key 获取属性值,这个属性值的类型可以是数字、字符串、数组、对象这几种。

  2. 数组:数组在js中是中括号[ ]括起来的内容,数据结构为 ["Python", "javascript", "C++", ...],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是 数字、字符串、数组、对象几种。

import json

json模块提供了四个功能:dumpsdumploadsload,用于字符串 和 python数据类型间进行转换。

1. json.loads()

把Json格式字符串解码转换成Python对象 从json到python的类型转化对照如下:

 

# json_loads.py

import json

strList = '[1, 2, 3, 4]'

strDict = '{"city": "北京", "name": "大猫"}'

json.loads(strList) 
# [1, 2, 3, 4]

json.loads(strDict) # json数据自动按Unicode存储
# {u'city': u'\u5317\u4eac', u'name': u'\u5927\u732b'}

json.loads(strDict, strict=False)  可以忽略部分错误

 
 

 

2. json.dumps()

实现python类型转化为json字符串,返回一个str对象 把一个Python对象编码转换成Json字符串

从python原始类型向json类型的转化对照如下:

 

# json_dumps.py

import json
import chardet

listStr = [1, 2, 3, 4]
tupleStr = (1, 2, 3, 4)
dictStr = {"city": "北京", "name": "大猫"}

json.dumps(listStr)
# '[1, 2, 3, 4]'
json.dumps(tupleStr)
# '[1, 2, 3, 4]'

# 注意:json.dumps() 处理中文时默认使用的ascii编码,会导致中文无法正常显示
print json.dumps(dictStr) 
# {"city": "\u5317\u4eac", "name": "\u5927\u732b"}

# 记住:处理中文时,添加参数 ensure_ascii=False 来禁用ascii编码
print json.dumps(dictStr, ensure_ascii=False) 
# {"city": "北京", "name": "大刘"}

  

3. json.dump()

将Python内置类型序列化为json对象后写入文件

# json_dump.py

import json

listStr = [{"city": "北京"}, {"name": "大刘"}]
json.dump(listStr, open("listStr.json","w"), ensure_ascii=False)

dictStr = {"city": "北京", "name": "大刘"}
json.dump(dictStr, open("dictStr.json","w"), ensure_ascii=False)

  

4. json.load()

读取文件中json形式的字符串元素 转化成python类型

# json_load.py

import json

strList = json.load(open("listStr.json"))
print strList

# [{u'city': u'\u5317\u4eac'}, {u'name': u'\u5927\u5218'}]

strDict = json.load(open("dictStr.json"))
print strDict
# {u'city': u'\u5317\u4eac', u'name': u'\u5927\u5218'}

  

JsonPath

JsonPath 是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,包括:Javascript, Python, PHP 和 Java。

JsonPath 对于 JSON 来说,相当于 XPath 对于 XML。

安装方法:pip install jsonpath

官方文档:http://goessner.net/articles/JsonPath

JsonPath与XPath语法对比:

Json结构清晰,可读性高,复杂度低,非常容易匹配,下表中对应了XPath的用法。

XPath JSONPath 描述
/ $ 根节点
. @ 现行节点
/ .or[] 取子节点
.. n/a 取父节点,Jsonpath未支持
// .. 就是不管位置,选择所有符合条件的条件
* * 匹配所有元素节点
@ n/a 根据属性访问,Json不支持,因为Json是个Key-value递归结构,不需要属性访问。
[] [] 迭代器标示(可以在里边做简单的迭代操作,如数组下标,根据内容选值等)
| [,] 支持迭代器中做多选。
[] ?() 支持过滤操作.
n/a () 支持表达式计算
() n/a 分组,JsonPath不支持

示例:

我们以拉勾网城市JSON文件 http://www.lagou.com/lbs/getAllCitySearchLabels.json 为例,获取所有城市。

# jsonpath_lagou.py

import urllib2
import jsonpath
import json

url = 'http://www.lagou.com/lbs/getAllCitySearchLabels.json'
request =urllib2.Request(url)
response = urllib2.urlopen(request)
html = response.read()

# 把json格式字符串转换成python对象
jsonobj = json.loads(html)

# 从根节点开始,匹配name节点
citylist = jsonpath.jsonpath(jsonobj,'$..name')

print citylist
print type(citylist)
fp = open('city.json','w')

content = json.dumps(citylist, ensure_ascii=False)
print content

fp.write(content.encode('utf-8'))
fp.close()

  

注意事项:

json.loads() 是把 Json格式字符串解码转换成Python对象,如果在json.loads的时候出错,要注意被解码的Json字符的编码,如果传入的字符串的编码不是UTF-8的话,需要指定字符编码的参数encoding

如:

dataDict = json.loads(jsonStrGBK);

  

jsonStrGBK是JSON字符串,假设其编码本身是非UTF-8的话而是GBK 的,那么上述代码会导致出错,改为对应的:

 dataDict = json.loads(jsonStrGBK, encoding="GBK");

  

附:字符串编码转换

这是中国程序员最苦逼的地方,什么乱码之类的几乎都是由汉字引起的。 其实编码问题很好搞定,只要记住一点:

任何平台的任何编码 都能和 Unicode 互相转换

UTF-8 与 GBK 互相转换,那就先把UTF-8转换成Unicode,再从Unicode转换成GBK,反之同理。

# 这是一个 UTF-8 编码的字符串
utf8Str = "你好地球"

# 1. 将 UTF-8 编码的字符串 转换成 Unicode 编码
unicodeStr = utf8Str.decode("UTF-8")

# 2. 再将 Unicode 编码格式字符串 转换成 GBK 编码
gbkData = unicodeStr.encode("GBK")

# 1. 再将 GBK 编码格式字符串 转化成 Unicode
unicodeStr = gbkData.decode("gbk")

# 2. 再将 Unicode 编码格式字符串转换成 UTF-8
utf8Str = unicodeStr.encode("UTF-8")

  

decode的作用是将其他编码的字符串转换成 Unicode 编码

encode的作用是将 Unicode 编码转换成其他编码的字符串

一句话:UTF-8是对Unicode字符集进行编码的一种编码方式

转载于:https://www.cnblogs.com/yoyo1216/p/10131296.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JSON 的相关文章

随机推荐

  • 腾达宽带连接服务器无响应,腾达(Tenda)无线路由器192.168.0.1打不开问题解决方法图文教程...

    本文介绍了腾达 Tenda 无线路由器192 168 0 1 打不开的解决办法 192 168 0 1是腾达无线路由器的设置网址 在浏览器中无法打开192 168 0 1登录页面 请参考下面的解决办法 方法一 正确设置电脑IP地址 这里以W
  • 循环单链表的销毁操作

    循环单链表销毁的时候 我的代码开始是这样子的 Status DestroyList L LinkList L 销毁链表 Lnode p while L p L L L gt next delete p return OK 不出意外的报错了
  • vue 弹窗 多选表格组件封装 以及 回调绑定

    组件
  • CUDA Toolkit多版本安装与配置

    CUDA Toolkit多版本安装目的是为了将CUDA Toolkit支持多个版本 并将当前版本更新到后续支持常见pytorch的版本 即cuda11 6 目前该系统默认安装的是cuda10 2 cuda11 0和cuda11 2 CUDA
  • layui折叠面板无效 - 已解决

    出现折叠面板无效 可能因为一下两点造成的 原因一 原因二 具体是为什么 我不清楚 正确的方式
  • Unity:给角色和敌人加上血条

    横条血条 想法 1 创建一个画布 画布里面包含血条 HealthBar 空对象 Fill image 血条填充物 Border image 血条框 Heart image 心脏图标 2 为HealthBar对象添加HealthBar脚本和S
  • 速腾聚创雷达最新驱动安装(包含ring和timestamp)运行lio-sam

    记录一下搞slam的过程 ring和timestamp 最近想跑lio sam 需要用到ring和timestamp两个参数 lio sam作者用的velodyne雷达是带这两个参数的 但是rs雷达的老版驱动录制的点云包没有这两个参数 在g
  • pandas分析数据的案例

    1 pandas分析电影数据的案例 https blog csdn net houyanhua1 article details 87858575
  • 共享停车位

    随着代步车的普及 对停车位的需求日益增长 停车位的供应跟不上汽车保有量的快速增长 地段有限 停车场有限 停车位有限 停车难已经成为当今 城市病 中最难解决的一环 随着共享经济的发展 错时停车的提出和实施也逐渐被大众接受 通过物联网创新技术实
  • 服务器自动备份怎么做,服务器运维技巧分享,用backup为数据库做定时备份

    写了套网站 除了日志需要定时分割外 数据库还需要定时备份 如果你用的是云服务器自带的备份功能 会更简单些 但也需要自行购买数据库服务器 对于像我这种还在初期的系统来说 能减少服务器的开支就一定要减少 毕竟现在还不挣钱 安装 用的是ruby
  • Ubuntu20 安装Ceres库和g2o库

    此文章主要适配视觉SLAM十四讲 Ubuntu20 04的情况 建议Ceres版本为2 0 0 g2o库为最新版 安装Ceres库 安装依赖 sudo apt get install liblapack dev libsuitesparse
  • JsonNode与java相互转换

    将Jackson JsonNode数组转换为Java List string JsonNode jsonNode getJsonPayload JsonNode partial jsonNode path someArrayField Li
  • 动态规划(C语言)

    一 入门 以斐波那契数列为例 它的第一项为1 第二项为1 从第三项开始 每一项的值都是前面两项的和 让我们求第n项的是多少 对于这个问题 我们从最开始的递归思想来看 int fib int n if n 1 n 2 return 1 ret
  • js对象的属性用中括号表示

    中括号运算符总是能代替点运算符 但点运算符却不一定能全部代替中括号运算符 中括号运算符可以用字符串变量的内容作为属性名 点运算符不能 中括号运算符可以用纯数字为属性名 点运算符不能 中括号运算符可以用js的关键字和保留字作为属性名 点运算符
  • RISC-V、ARM和X86架构

    1 要了解X86 ARM和RISC V架构的区别 就得先了解复杂指令集 CISC 和精简指令集 RISC A X86使用的是复杂指令集 CISC ARM和RISC V使用的是精简指令集 RISC 这便是属于这几种架构之间最大的区别 狭义的x
  • javaweb使用Thymeleaf 最凝练的CRUD项目-上

    目录 最凝练的CRUD 1 建模 物理建模 逻辑建模 2 总体架构 3 搭建持久化层所需环境 导入jar包 创建jdbc properties 创建JDBCUtils工具类 BaseDao 4 搭建表述层所需环境 导入jar包 创建View
  • 力扣(19) - 跳跃游戏

    给定一个非负整数数组 nums 你最初位于数组的 第一个下标 数组中的每个元素代表你在该位置可以跳跃的最大长度 判断你是否能够到达最后一个下标 示例 1 输入 nums 2 3 1 1 4 输出 true 解释 可以先跳 1 步 从下标 0
  • a*算法的优缺点_轻松理解机器学习算法-朴素贝叶斯

    1 预备知识 贝叶斯定理 Bayes theorem 是概率论中的一个定理 它跟随机变量的条件概率以及边缘概率分布有关 通常事件A在事件B发生的条件下的概率 与事件B在事件A发生的条件下的概率是不一样的 然而这两种是有确定关系的 这种关系就
  • ASP.NET Core 简介

    NET Core 是 NET Framework 的新一代版本 是微软开发的第一个具有跨平台 Windows Mac OSX Linux 能力的应用程序开发框 ASP NET Core 是 Microsoft 新开发的 基于 NET Cor
  • JSON

    数据提取之JSON与JsonPATH JSON JavaScript Object Notation 是一种轻量级的数据交换格式 它使得人们很容易的进行阅读和编写 同时也方便了机器进行解析和生成 适用于进行数据交互的场景 比如网站前台与后台