用 Python 操作 JSON 類型數據詳解

2021-02-20 Python中文社區

JSON簡介

JSON(JavaScript Object Notation)是一種輕量級的數據交換格式。易於人閱讀和編寫。同時也易於機器解析和生成。它基於JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一個子集。JSON採用完全獨立於語言的文本格式,但是也使用了類似於C語言家族的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)。這些特性使JSON成為理想的數據交換語言。

JSON官方網站

http:

JSON是一種基於文本,獨立於語言的輕量級數據交換格式。JSON的基本語法如下:

1、JSON名稱/值對。JSON 數據的書寫格式是:名稱/值對。名稱/值對包括欄位名稱(在雙引號中),然後著是一個冒號(:),最後是值。比如{ "name" : "Python" },類似於Python中的字典。

2、JSON值。JSON值可以是數字(整數或浮點數),字符串(在雙引號中),邏輯值(True 或False),數組(在中括號中),對象(在大括號中)和null。例如{ "age": 21,"graduated ":true }。JSON值的基本格式如下圖所示。

圖 JSON值的基本格式

3、JSON對象。JSON 對象在花括號({})中書寫,對象可以包含多個名稱/值對,多個JSON名稱/值以」,」進行分隔。例如{ "name":"Pyton" , "age": 25}。JSON對象的基本格式如下圖所示。

圖 JSON對象

4、JSON 數組。JSON 數組在方括號中書寫,數組可包含多個JSON對象。例如:

{
    "sites": [
        { "name": "jd",  "url": "www.jd.com"   },
        { "name": "taobao",   "url": "www.taobao.com" }
    ]
}

在本例中對象」sites」是包含2個對象的數組。JSON數組的的基本格式如下圖所示。

Python操作JSON

Pythone3標準庫有JSON模塊,主要執行序列化和反序列化功能。

1、json模塊的主要函數

在Python3的json模塊中json.dumps()函數將Python對象編碼成JSON字符串。使用的語法如下:

import json
dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True, allow_nan=True, cls=None, indent=None, separators=None, default=None, sort_keys=False, **kw)

主要參數說明:

sort_keys:表示序列化JSON對象時是否對字典的key進行排序,字典默認是無序的。

indent:表示縮進,可以是數據格式可讀性更強,格式化輸出JSON字符串,如果ident是一個非負的整數,那麼JSONarray元素和object成員將會被以相應的縮進級別進行列印輸出。

separators:當使用ident參數時json模塊序列化Python對象後得到的JSON字符串中的」,」號和」:」號分隔符後默認會附加一個空白字符,可以通過separators參數重新指定分隔符,去除無用的空白字符。指定的分隔符一般是一個元祖類型的數據,比如(',',':')。

使用json模塊的json.load()函數,將JSON格式的字符串轉換成Python對象,使用的語法格式如下:

import json
json.load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw)

2、JSON字符串與Python 原始類型之間數據類型對應關係

Python 原始類型向JSON類型的轉化對照表,如表所示:

表 Python原始類型向JSON類型的轉化對照表

JSON類型向Python 原始類型的轉化對照表,如表所示:

表 JSON類型向Python原始類型的轉化對照表

3、序列化操作實例

import json

data ={'name':"wangwu" , 'lang': ('python' ,'java'), 'age':20 }
data_json = json.dumps( data )

print( data)
# 輸出結果為[{'name': 'wangwu', 'lang': ('python', 'java'), 'age': 20}]

print( data_json )
# 輸出結果為 [{"name": "wangwu", "lang": ["python", "java"], "age": 20}]

從返回結果可以看出data_json字符串中lang數據類型從元祖變成了列表。
還可以對列印的json字符進行美化,可以使用如下Python語句。

data_json = json.dumps(data,sort_keys = True, indent=2 )
print( data_json )

輸出結果為

{
  "age": 20,
  "lang": [
    "python",
    "java"
  ],
  "name": "wangwu"
}

如果要對輸出json字符串去除無用的空白字符,可以使用如下Python語句。

data_json = json.dumps(data,sort_keys = True,separators=(',',':') )
print( data_json )

輸出結果為:

{"age":20,"lang":["python","java"],"name":"wangwu"}

4、反序列化操作實例,把JSON格式字符串轉換為Python對象

new_data = json.loads(data_json )
print(new_data )
print(type(new_data))

輸出結果為:

{'age': 20, 'lang': ['python', 'java'], 'name': 'wangwu'}
<class 'dict'>

從返回結果可以看出,解碼後並沒有將原始數據data_json的lang數據還原成元祖,而是還原成了列表。

自定義對象的序列化

如果是類對象,是不是可以可以直接用json.dumps(obj)序列化對象呢?答案是不可以的,需要在類對象裡編寫轉換函數。

例子:自定義對象的序列化

import json  

class Man(object):
    def __init__(self, name, age ):
        self.name = name
        self.age = age


def obj2json(obj):
    return {
            "name" : obj.name,
            "age" : obj.age
            }

man = Man('tom' , 21)
jsonDataStr = json.dumps( man , default=obj2json)
print( jsonDataStr )

運行腳本得到以下輸出結果:

{"name": "tom", "age": 21}

json.dumps()函數中的可選參數default就是把任意一個對象變成一個可序列為JSON的對象,我們只需要為Man專門寫一個轉換函數,再把函數傳進去即可。

通過一種簡單的方式,用lambda方式來轉換任意一個類對象為JSON形式。

jsonDataStr = json.dumps(man, default=lambda obj: obj.__dict__)

lambda obj: obj.__dict__會將任意的對象的屬性,轉換成字典的方式。同樣的道理,如果要將JSON對象反序列化,也需要寫個反序列化函數來轉換。

json.loads(json_str, object_hook=handle)
import json  

class Man(object):
    def __init__(self, name, age ):
        self.name = name
        self.age = age

def obj2json(obj):
    return {
            "name" : obj.name,
            "age" : obj.age
            }


def handle( obj ):
    print( type(obj))
    return Man(obj['name'] , obj['age'])

man = Man('tom' , 21)
jsonDataStr = json.dumps( man , default=obj2json)

jsonObj = json.loads(jsonDataStr, object_hook=handle  )

在本例中編寫反序列化函數handle()把JSON字符串轉換成Python類的對象。

留言回覆你用Python做過哪些有趣的應用項目,我們會在留言中隨機抽取一位讀者免費送出北京大學出版社出版的《Python 3 數據分析與機器學習實戰》圖書一本。

文章節選自北京大學出版社出版的《Python 3 數據分析與機器學習實戰》,本書現在京東參加滿100減50的活動,點擊閱讀原文購書有優惠~

相關焦點

  • Python 讀取 JSON 數據的騷操作
    json 模塊提供了一種很簡單的方式來編碼和解碼 JSON 數據。JSON 編碼的字符串轉換回一個 Python 數據結構:data = json.loads(json_str)如果你要處理的是文件而不是字符串,你可以使用 json.dump() 和 json.load()來編碼和解碼 JSON 數據。
  • 【python】讀取json文件
    這些特性使JSON成為理想的數據交換語言。易於人閱讀和編寫,同時也易於機器解析和生成(一般用於提升網絡傳輸速率)。JSON在python中分別由list和dict組成。這是用於序列化的兩個模塊:json: 用於字符串和python數據類型間進行轉換pickle: 用於python特有的類型和python的數據類型間進行轉換Json模塊提供了四個功能:dumps、dump、loads、loadpickle模塊提供了四個功能:dumps、dump、loads、load細節注意:
  • 如何利用Python處理JSON格式的數據,建議收藏!!!
    JSON成為理想的數據交換語言,而在Python中處理JSON格式的模塊有json和pickle兩個json模塊和pickle都提供了四個方法:dumps, dump, loads, load序列化:將python的數據轉換為json格式的字符串反序列化:將json格式的字符串轉換成python的數據類型首先我們來看一下序列化是如何操作的,我們首先用json.dump()將字典寫入json
  • 乾貨|如何利用Python處理JSON格式的數據,建議收藏!
    >序列化:將python的數據轉換為json格式的字符串反序列化:將json格式的字符串轉換成python的數據類型序列化首先我們來看一下序列化是如何操作的,我們首先用json.dump()將字典寫入json格式的文件中能夠進行類似操作的則是dataframe當中的to_json()方法,比方說而當你分別打開這兩個文件時,裡面的內容分別是以鍵值對呈現的json數據。
  • 詳解用Python中json模塊進行序列化操作
    上一篇內容,我們詳細講解了Python中使用pickle模塊進行數據序列化處理的方法(參見如何序列化處理數據?真的會用pickle嗎?python中常用模塊詳解)。對於Python內部數據,使用pickle模塊對數據進行序列化操作無疑是最佳選擇。
  • Python處理json總結
    跟python中的字典看起來很像,兩者之間的區別?1)json的key只能是字符串,dict的key可以是任何可hash的對象,例如:字符串、數字、元組等;2)字典是一種數據結構,json是一種數據格式;字典有很多內置函數,有多種調用方法,而json是數據打包的一種格式,並不像字典具備操作性;3)json的字符串強制用雙引號,dict的字符串可以用單引號、雙引號;一般而言,我們會把json轉化為python
  • mysql field json MySQL JSON 類型數據操作
    -+1 row in set (0.00 sec)mysql>SELECTJSON_OVERLAPS("[1,3,5,7]","[2,6,8]");±---+|JSON_OVERLAPS("[1,3,5,7]", 「[2,6,8]」)|±---+|0|±---+1、查詢JSON中的數據用
  • Python 標準庫之 JSON
    就數據傳遞而言, XML 是一種選擇,當然這裡還有另一種選擇 -- 「JSON」。它是一種輕量級的數據交換格式,如果各位想要做 Web 編程的話,則肯定會用到它。下面我們就開始今天的學習。基本操作JSON 模塊相比於 XML 來說真的是簡單多了:>>> import json>>> json.
  • python如何編碼解碼解析json對象
    前言json是一種以鍵值對形式存在的輕量級的數據結構,和python中的字典類型具有相同的表現結構。使用 JSON 函數需要導入 json 庫:import json。在Java中我們知道json有jsonObject和jsonArray,且可以通過String、map等相互轉換,那麼在python中,json對象是如何來讀取解析的呢?python解析json對象1.json.dumpsjson.dumps用於將 Python 對象編碼成 JSON 字符串。
  • python教程實戰,json、csv等讀寫
    這種數據在弄爬蟲的時候,經常會見到這類型的數據。下面展示一個簡單的json數據。{ "name": "json", "describe": "是存儲和交換文本信息的語法。類似 XML。"}{ "key": ["a", "b", "sojson.com"]}{ "title": "python 入門", "type": "新手入門", "本篇內容": [ "JSON描述", "JSON數據讀取", "JSON數據構造", "CSV", { "office": [
  • python解析json方法
    最近在學ES,往裡面灌數據,ES默認格式是json,因此需要用到python去處理json格式。
  • Python中json模塊的使用介紹
    json裡要使用雙引號表示字符串# 在js語言中,一切都是對象,因此,任何支持的類型都可以通過json 來表示,例如字符串、數字、對象、數組等# 在python中,有專門處理json格式的模塊:json模塊 和 picle模塊# Json 模塊提供了四個方法:dumps、dump、loads、load# pickle 模塊也提供了四個功能:dumps
  • 如何利用Python處理JSON格式的數據接口(詳細版)
    因此,任何支持的類型都可以通過JSON來表示,例如字符串、數字、對象、數組等。但是對象和數組是比較特殊且常用的兩種類型:對象表示為鍵值對數據由逗號分隔花括號保存對象方括號保存數組1.為了方便學習,我這邊註冊了一個百度天氣的api接口,獲取JSON格式的數據import requestsurl ='http://api.map.baidu.com
  • Python之數據序列化(json、pickle、shelve)
    dumps()dump()loads()load()shelve專門用於將Python數據類型的數據持久化到磁碟,shelve是一個類似dict的對象,操作十分便捷open() 二、json模塊   大部分程式語言都會提供處理json數據的接口,Python 2.6開始加入了json模塊,且把它作為一個內置模塊提供
  • 使用json模塊對字典進行排序—Python進行序列化操作的另類探討
    上面的內容,我們梳理了json模塊的四個常用的方法(參見知其然,更要知其所以然!詳解用Python中json模塊進行序列化操作),並對其中方法中的若干參數進行了有史以來最為詳細的梳理。有嗎?我們簡單來看一下!
  • python讀寫json文件
    輸出結果,最外圍是一個字典,而字典的值既可以是基本的數據類型,比如數值,字符串,又可以是列表,字典等數據結構,相互嵌套,就構成了整個json文件。對於json文件的讀寫,也稱之為json的編碼和解碼。所謂解碼,就是將文字格式的json轉換為程式語言中的對象,編碼則相反,將程式語言中的對象轉換為json格式的字符串。
  • 基於Python實現對各種數據文件的操作
    常見的數據文件類型如下:txtcsvexcel(xls\xlsx)在線網頁數據pdf\word其他數據軟體格式1 txt文件更多參考:https://docs.python.org/3/tutorial/inputoutput.html
  • 4個小竅門,讓你在Python中高效使用JSON!
    圖源:unsplash字典和列表是 Python的兩種數據類型,也是用來處理JSON的完美工具。本文將主要分享以下內容:· 如何載入、編寫JSON?· 任何 null 都將被轉換為Python的None類型。
  • Python 如何將字符串轉換成 json ?
    最近在工作中遇到了一個小問題,如果要將字符串型的數據轉換成dict類型,我第一時間就想到了使用json函數。
  • Python入門進階教程-JSON操作
    ,其設計意圖是把所有事情都用設計的字符串來表示,這樣既方便在網際網路上傳遞信息,也方便人進行閱讀。這種數據結構在 Python 中對應於列表;在其他語言中,可能對應於 list等。JSON數據類型當程序把 JSON 對象或 JSON 字符串轉換成 Python 對象時,從 JSON 類型到 Python 類型的轉換關係如下所示:JSON類型Python類型JSON 類型Python 類型對象(object)字典(dict)數組(array列表(list)字符串(string)