記事のディレクトリ
JSON
定義
- JSON(JavaScript Object Notation)は、人々が簡単に読み書きできるようにする軽量のデータ交換形式です。同時に、機械が分析して生成するのに便利です。これは、フロントデスクとWebサイトのバックエンド間のデータ相互作用などのデータ相互作用シナリオに適しています。
- JSONとXMLの比較は同等です。
オブジェクト{}:JSONObject
- オブジェクト:オブジェクトはjsで{}で囲まれたコンテンツとして表現され、データ構造はキーと値のペアの構造です{キー:値、キー:値、…}。オブジェクト指向言語では、キーは属性です。オブジェクトの値、およびvalueこれは対応する属性値であるため、理解しやすいです。valueメソッドは、属性値を取得するためのobject.keyです。この属性値のタイプは、数値、文字列、配列、およびオブジェクトです。
Array []:JSONArray
- 配列:配列はjsの角括弧[]で囲まれたコンテンツであり、データ構造は["Python"、 "javascript"、 "C ++"、…]であり、valueメソッドはすべての言語と同じであり、インデックスを使用して取得します。 、フィールド値タイプには、数値、文字列、配列、およびオブジェクトを指定できます。
方法
-
開いているファイルをロードする
# 读取文件中json形式的字符串元素 转化成python类型 obj = json.load(open('book.json', 'r', encoding='utf-8')) print(type(obj)
-
文字列をロードします
# 把Json格式字符串解码转换成Python对象 # 从json到python的类型转化对照如图所示 with open('./book.json',mode='r',encoding='utf-8') as f: json_string = f.read() # 将json格式字符串转化为对象 obj = json.loads(json_string) print(type(obj))
-
ストリング
str = '''{"has_more": false, "message": "success", "data": [{"single_mode": true, "abstract": "\u8c22\u8c22\u5927\u5bb6\u559c\u6b22\u6bcf\u65e5\u64b8"}]}'''
-
ダンプ
# 实现python类型转化为json字符串,返回一个str对象 把一个Python对象编码转换成Json字符串 # 从python原始类型向json类型的转化对照 import json str = '''{"has_more": false, "message": "success", "data": [{"single_mode": true, "abstract": "\u8c22\u8c22\u5927\u5bb6\u559c\u6b22\u6bcf\u65e5\u64b8"}]}''' print(type(str)) print(json.dumps(str,ensure_ascii=False))
-
投げ捨てる
# 将Python内置类型序列化为json对象后写入文件 import json dictStr = { "city": "北京", "name": "大刘",'info':'\u8c22\u8c22\u5927'} # Serialize ``obj`` as a JSON formatted stream to ``fp json.dump(dictStr, open("dictStr.json","w",encoding='utf-8'), ensure_ascii=False,)
JSONとPythonのデータ型は互いに競合します
JSON | Python |
---|---|
オブジェクト | 辞書 |
アレイ | リスト、タプル |
ストリング | Unicode |
number(int) | int、long |
数(実数) | 浮く |
true | 本当 |
false | 誤り |
ヌル | なし |
JsonPath
定義
-
JsonPathは情報抽出ライブラリであり、JSONドキュメントから指定された情報を抽出するためのツールであり、Javascript、Python、PHP、Javaなどの複数の言語バージョンを提供します。
-
JSONのJsonPathは、XMLのXPATHと同等です。
JsonPathとXPathの構文比較
XPath | JsonPath | 説明 |
---|---|---|
/ | $ | ルートノード |
。 | @ | 現在のノード |
/ | 。または[] | 子ノードを取る |
… | 親ノードを取得します。JsonPathはサポートしていません | |
// | … | すべての場所ですべての適格な条件を選択します |
* | * | すべての要素ノードに一致 |
@ | 属性アクセスによると、Jsonはキー値再帰構造であるため、Jsonはサポートしていません。 | |
[] | [] | イテレータの識別(配列の添え字、コンテンツに基づいた値の選択など、単純な反復操作を実行できます) |
| | [、] | 反復での複数選択のサポート |
[] | ?() | フィルタリング操作をサポート |
() | 式の計算をサポート | |
() | グループ化、JsonPathはサポートしていません |
文法例の比較
XPath | JsonPath | 結果 |
---|---|---|
/ store / book / author | $ .store.book [*]。author | 書店のすべての本の著者 |
//著者 | $…著者 | すべての著者 |
//お店/* | $ .store。* | ストアのすべての要素。すべての本と自転車 |
/ store // price | $ .store…price | ストア内のすべての価格 |
// book [3] | $…book [2] | 3冊目 |
// book [last()] | $…book [(@。length-1)] | 最後の本 |
// book [position()<3] | s…book [0,1]またはs…book [:2] | 最初の2冊の本 |
// book [isbn] | $…book [?(@。isbn)] | isbnを含むすべての書籍を除外する |
// book [price <10] | $…book [?(@。price <10)] | 価格が10未満の本を除外する |
// * | $…* | すべての要素 |
JsonPathの基本的な使用法
import json
# xpath
# pip install jsonpath 专门解析json类型的数据
import jsonpath
import requests
# s = '''{"key":"Hello","dict":"World"}'''
# print(type(s))
# json_obj = json.loads(s,encoding='utf-8')
# print(json_obj)
# print(type(json_obj))
# print(json_obj['key'])
url = 'https://www.lagou.com/lbs/getAllCitySearchLabels.json'
if __name__ == '__main__':
headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cache-Control': 'max-age=0',
'Connection': 'keep-alive',
'Cookie': 'user_trace_token=20170911115921-976c1ee9-96a5-11e7-8e78-525400f775ce; LGUID=20170911115921-976c23ed-96a5-11e7-8e78-525400f775ce; _ga=GA1.2.999441537.1505102359; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%221680c0e7fe84b5-09d8e2e6bf1c25-5e442e19-1327104-1680c0e7fe9c9%22%2C%22%24device_id%22%3A%221680c0e7fe84b5-09d8e2e6bf1c25-5e442e19-1327104-1680c0e7fe9c9%22%2C%22props%22%3A%7B%22%24latest_traffic_source_type%22%3A%22%E7%9B%B4%E6%8E%A5%E6%B5%81%E9%87%8F%22%2C%22%24latest_referrer%22%3A%22%22%2C%22%24latest_referrer_host%22%3A%22%22%2C%22%24latest_search_keyword%22%3A%22%E6%9C%AA%E5%8F%96%E5%88%B0%E5%80%BC_%E7%9B%B4%E6%8E%A5%E6%89%93%E5%BC%80%22%2C%22%24latest_utm_source%22%3A%22m_cf_cpc_baidu_pc%22%7D%7D; LG_HAS_LOGIN=1; gate_login_token=8586a02d54456365d23dc7b47a95ba949ed3cf351688cd37; LG_LOGIN_USER_ID=410cde6b7ecf76cb8f5c12869d780fb3c721f5b00f5a1a87; showExpriedIndex=1; showExpriedCompanyHome=1; showExpriedMyPublish=1; hasDeliver=2; index_location_city=%E5%8C%97%E4%BA%AC; privacyPolicyPopup=false; Hm_lvt_4233e74dff0ae5bd0a3d81c6ccf756e6=1571903416,1571970618,1572354935; _gid=GA1.2.387582430.1572354935; JSESSIONID=ABAAABAAAIAACBI3C82CE49769577D6151513758B1646B9',
'Host': 'www.lagou.com',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-Site': 'none',
'Sec-Fetch-User': '?1',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.70 Safari/537.36', }
# response = requests.get(url=url, headers=headers)
# data = response.text
# json_obj = json.loads(data,encoding='utf-8')
# print(json_obj['content']['data']['allCitySearchLabels']['B'][0]['name'])
# result = jsonpath.jsonpath(json_obj,'$..[name,id,code]')
# print(result)
# # 返回列表,只有一个数据
# # data = jsonpath.jsonpath(json_obj,'$.content[data]')
# data = jsonpath.jsonpath(json_obj,'$.content.data')
# print(data)
# print(len(data))
data = '''{ "store": {
"book": [
{ "category": "reference",
"author": "李白",
"title": "Sayings of the Century",
"price": 8.95
},
{ "category": "fiction",
"author": "杜甫",
"title": "Sword of Honour",
"price": 12.99
},
{ "category": "fiction",
"author": "白居易",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
},
{ "category": "fiction",
"author": "苏轼",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
}
}'''
json_obj = json.loads(data, encoding='utf-8')
# print(jsonpath.jsonpath(json_obj,'$.store.book[*].author'))
# print(jsonpath.jsonpath(json_obj,'$..author'))
# print(jsonpath.jsonpath(json_obj,'$.store.book[?(@.price>12)]'))
# jsonpath 索引从0开始的
# print(jsonpath.jsonpath(json_obj,'$.store.book[0]'))
# @当前,当前列表长度 - 1 最后一个对象
# print(jsonpath.jsonpath(json_obj,'$.store.book[(@.length -1)]'))
print(jsonpath.jsonpath(json_obj, '$.store.book[?(@.isbn)]'))
インスタンス
-
例1:ラグー市のデータ
# 拉勾网城市JSON文件 http://www.lagou.com/lbs/getAllCitySearchLabels.json 为例,获取所有城市 import requests import jsonpath import json url = 'https://www.lagou.com/lbs/getAllCitySearchLabels.json/' response = requests.get(url,verify = False) html = response.text # 把json格式字符串转换成python对象 jsonobj = json.loads(html) # 从根节点开始,匹配name节点 citylist = jsonpath.jsonpath(jsonobj,'$..name') # 把一个Python对象编码转换成Json字符串 content = json.dumps(citylist, ensure_ascii=False) with open('city.json','wb') as f: f.write(content.encode('utf-8'))
- 都市= jsonpath.jsonpath(obj、 '$…[name、id、code]')
- content = jsonpath.jsonpath(obj、 '$ .content [data]')
-
例2冊のjsonデータ
import json import jsonpath obj = json.load(open('book.json', 'r', encoding='utf-8')) print(type(obj)) # 通过如下函数使用jsonpath # 参数1:json对象,参数2:jsonpath # $ 代表的是根节点 # . 就类似于xpath里面的 / # 【路径含义】从根开始一步一步找到指定书本的作者,如果写*代表所有的book,写下标代表的是指定book,注意,下标从0开始,查找所有book的作者,必须写* ret = jsonpath.jsonpath(obj, '$.store.book[*].author') ret = jsonpath.jsonpath(obj, '$..author') ret = jsonpath.jsonpath(obj, '$.store..price') # 查找最后一本书 ret = jsonpath.jsonpath(obj, '$..book[(@.length-1)]') ret = jsonpath.jsonpath(obj, '$..book[:2]') print(ret)