python json數據的轉換和jsonpath的使用


一、Json模塊 

JSON(JavaScript Object Notation)是一種輕量級的數據交換格式,它是的人們很容易的進行閱讀和編寫。同時也方便了機器進行解析和生成。適用於進行數據交互的場景,比如網站前台與后台之間的數據交互。

JSON和XML的比較可謂不相上下

  1、json結構:對象和數組

  • 對象:對象在js中表示為{}括起來的內容,數據結構為{key:value,key:value,...}的鍵值對的結構,在面向對象的語言中,key為對象的屬性,value為對應的屬性值,所以很容易理解,取值方法為對象.key獲取屬性值,這個屬性值的類型可以是數字、字符串、數組、對象這幾種。
  • 數組:數組在js中是中括號[]括起來的內容,數據結構為["Python", "javascript", "C++",..],取值方式和所有語言中一樣,使用索引獲取,字段值的類型可以是數字、字符串、數組、對象幾種。

  2、json數據的轉換

  • **不能使用dict將json字符串轉換為字典
  • **不能使用eval將json字符串轉換為字典,json中的null在python中無法識別,會當成變量處理
  • loads():將json字符串轉換為python類型的,或自動將null轉換為None
  • dumps():將python類型的數據轉換為json字符串,會自動將None轉換為null
data = {"name": "ming", "id": 18, "msg": None}
json_data = '{"name":"Tom","id":19,"msg":null}'

json.loads()將json字符串轉換為python類型的,或自動將null轉換為None

resp = json.loads(json_data)
print(type(resp), resp)

#(<type 'dict'>, {u'msg': None, u'name': u'json', u'id': 19})

 json.load() 讀取文件中json形式的字符串元素轉化成python類型

strList = json.load(open("listStr.json"))
print(type(strList), strList)
#(<type 'list'>, [{u'city': u'\u5317\u4eac'}, {u'name': u'python_list'}])

strDict = json.load(open("dictStr.json"))
print(type(strDict), strDict)
#(<type 'dict'>, {u'city': u'\u5317\u4eac', u'name': u'python_dict'})

json.dumps() 將python類型的數據轉換為json字符串,會自動將None轉換為null

req = json.dumps(data)
print(type(req),req)
# (<type 'str'>, '{"msg": null, "name": "python", "id": 18}')

json.dump()  將Python內置類型序列化為json對象后寫入文件

listStr = [{"city": "北京"}, {"name":"python_list"}]

json.dump(listStr, open("listStr.json", "w"), ensure_ascii=False)

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

二,jsonpath

  • JSONPath表達式始終以與XPath表達式與XML文檔結合使用的相同方式引用JSON結構。由於JSON結構通常是匿名的,並且不一定具有“根成員對象”,因此JSONPath假定$分配給外部對象的抽象名稱。[摘自官方文檔]
  • JSONPath表達式可以使用點號-表示法:$.store.book[0].title
  • 括號符號:$['store']['book'][0]['title']
  • JSONPath允許通配符 *表示成員名稱和數組索引

JsonPath與XPath語法對比:

案例:

import jsonpath

# 數據源:
json_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數據,找到uname節點,如果沒有就會報錯
data1 = json_data["store"]["bicycle"]['color']
print(data1) #"red"

# jsonpath取值不需要看json數據,直接通過..(..就表示全局檢索后面跟的屬性)全局搜索uname屬性,如果沒有返回FALSE
data2 = jsonpath.jsonpath(json_data, "$..color")
print(data2)  #["red"]
data3 = jsonpath.jsonpath(json_data, "$.store.bicycle.color")
print(data3)  #["red"]
datas = jsonpath.jsonpath(json_data, "$..author")
print(datas) #['李白', '杜甫', '白居易', '蘇軾']

 

注意事項:

json.loads()是把Json格式字符串解碼轉換成Python對象,如果在json.loads的時候出錯,要注意被解碼的Json字符的編碼。

如果傳入的字符串的編碼不是UTF-8的話,需要制定字符編碼的參數:encoding

dataDict = json.loads(jsonStrGBK);
  • dataJsonStr是JSON字符串,假設其編碼本身是非UTF-8的話而是GBK的,那么上述代碼會導致出錯,改為對應的。
dataDict = json.loads(jsonStrGBK, encoding="GBK")
  • 如果dataJsonStr通過encoding指定了合適的編碼,但是其中又包含了其它編碼的字符,則需要先去將dataJsonStr轉換為Unicode,然后再指定編碼格式調用json.loads()
dataJsonStrUni = data.JsonStr.decode("GB2312")
dataDict = json.loads(dataJsontrUni, encoding="GB2312")

字符串編碼轉換

這是程序員最苦逼的地方,什么亂碼之類的幾乎都是由漢字引起的。
其實編碼問題很好搞定,只要記住一點:任何平台的任何編碼,都能和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編碼轉換成其他編碼的字符串

 

 感謝https://www.cnblogs.com/miqi1992/p/8081244.html

 感謝https://www.cnblogs.com/miqi1992/p/8081244.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM