まず、JSONは何ですか?
それは単にJSONはJavaScriptのオブジェクトと配列であるので、2つの構造は、オブジェクトと二つの構造のアレイであり、二つの構造は、複雑な構造の多様で表すことができます。
- オブジェクト:オブジェクトのJSは、として表現
{ }
囲まコンテンツ、データ構造{ key:value, key:value, ... }
のキーの設定、オブジェクト指向言語、それは容易に理解されるようにオブジェクトのキー属性、対応するプロパティ値の値で、値のオブジェクトのプロパティ値を取得する.KEY方法、属性値の種類は数、文字することができ、文字列、配列、オブジェクトのこれらのタイプ。
- アレイ:アレイは、JSの括弧にある
[ ]
囲まれたコンテンツは、データ構造["Python", "javascript", "C++", ...]
のすべての言語で、モード値、取得インデックス、値型フィールドの使用は、数字、文字列、アレイ、いくつかのオブジェクトとすることができます。
二、JSONの基本的な機能
JSONモジュールは、4つの機能を提供する:dumps
、、 、、dump
およびインターPythonの文字列データ型変換のために。loads
load
1.json.loads()
書式文字列を変換することは、以下のように変換の種類を制御するために、PythonのPythonのJSONからJSONオブジェクトに復号されます。
#Json_loads.py インポートJSONの strlist = ' [1、2 ,. 3 ,. 4] ' strDict = ' { "都市": "北京"、 "名": "ビッグキャット"} ' json.loads(strlist) #1 [1。 、2 ,. 3 ,. 4] json.loads(strDict) #のJSONデータを自動的にUnicodeとして格納されている #{u'city ':U'の\ u5317の\のu4eac 'u'name' U '\ u5927 \ u732b'}
2.json.dumps()
文字列に実装されたPython JSON型、STRターゲットオブジェクトを返すJSONとしてエンコードPython文字列を変換することです
次のように制御の元の型PythonのJSON型からの変換があります。
#Json_dumps.py インポートJSON インポートchardet listStr = [1,2 ,. 3 ,. 4。] tupleStr =(1,2 ,. 3 ,. 4 ) dictStr = { " 市":" 北京"、" 名":" ビッグキャット" } json.dumps(listStr) #'[1、2 ,. 3 ,. 4。]' json.dumps(tupleStr) #'[1、2 ,. 3 ,. 4。]' #1 注:json.dumps()デフォルトのシリアル化ASCIIエンコーディング #はensure_asciiを符号化パラメータの追加= Falseを無効ASCII、UTF-8でエンコードされた #chardet.detect()返回字典、其中自信是检测精确度 json.dumps(dictStr) #'{ "都市": "\\ u5317 \\ u4eac"、 "名": "\\ u5927 \\ u5218"}' chardet.detect(json.dumps(dictStr)) #{ '信頼':1.0、 'エンコーディング': 'ASCII'} 印刷 json.dumps(dictStr、ensure_ascii = 偽) #{ "都市": "北京"、「名前「: "大刘"} chardet.detect(json.dumps(dictStr、ensure_ascii = 偽)) #{ '信頼' 150、 'エンコーディング': 'UTF-8'}
3.json.dump()
ファイルは内蔵のPythonの型オブジェクトに書き込まれた後、JSONにシリアライズされています
#1 json_dump.pyの インポートJSON listStr = [{ " 街":" 北京" }、{ " 名前":" 大刘" }] json.dump(listStr、オープン(" listStr.json "、" W ")、ensure_ascii = False)が dictStr = { " 都市":" 北京"、" 名":" 大刘"} json.dump(dictStr、オープン(" dictStr.json "、" W ")、偽= ensure_ascii)
4.json.load()
JSONファイルの読み出しは、文字列の要素型のpythonの形式に変換され、
#1 json_load.pyの インポートJSON strList = json.load(オープン(" listStr.json " )) 印刷strListの #1 [{u'city 'U'の\ u5317の\のu4eac '}、{u'name' U '\ u5927 \ u5218 '}] strDict = json.load(オープン(" dictStr.json " )) 印刷strDictの #{u'city':U '\ u5317 \ u4eac'、u'name 'U' \ u5927 \ u5218' }
三、JsonPath
1.JsonPathルール
XPathの | JSONPath | 説明 |
---|---|---|
/ |
$ |
ルート |
. |
@ |
現在のノード |
/ |
. 若しくは[] |
子ノードを取ります |
.. |
N / A | 親ノードを取り、Jsonpathはサポートしていません |
// |
.. |
つまり、すべての適格条件を選択し、場所に関係なく、あります |
* |
* |
一致するすべての要素ノード |
@ |
N / A | JSONのキーと値がありません、再帰的な構造であるため、プロパティへのアクセスによると、JSONは、サポートされていません。 |
[] |
[] |
フラグイテレータ(単純反復操作は、配列インデックスとして、その中に行うことができ、コンテンツの選択された値、等に応じて) |
| | [,] |
サポートイテレータは、複数の選択を行います。 |
[] |
?() |
フィルタリングをサポートしています。 |
N / A | () |
式の評価のためのサポート |
() |
N / A | グループ化、JsonPathはサポートされていません |
2.例
# jsonpath_lagou.py import urllib2 import jsonpath import json import chardet 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()
注意事项:
##字符串编码转换 这是中国程序员最苦逼的地方,什么乱码之类的几乎都是由汉字引起的。 其实编码问题很好搞定,只要记住一点: ####任何平台的任何编码 都能和 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") # 3. 再将 GBK 编码格式字符串 转化成 Unicode unicodeStr = gbkData.decode("gbk") # 4. 再将 Unicode 编码格式字符串转换成 UTF-8 utf8Str = unicodeStr.encode("UTF-8")