#45508: python 內建模組 json


sam851015@gmail.com (多挖鼻孔有益身心健康)

學校 : 臺中市立惠文高級中學
編號 : 277705
來源 : [123.192.228.253]
最後登入時間 :
2025-03-11 12:39:29
b867. Jason -- 105學年度板橋高中校內資訊學科能力競賽(三) | From: [123.192.228.253] | 發表日期 : 2025-03-11 13:23

如果你有看懂 json 格式,那你應該能注意到這完全就是 python 的字典 dict 的格式,幾乎一模一樣。

區別在於 python 允許使用單引號 ' 表達字符串,而 json 僅允許使用雙引號 "

所以你只需要跟著題目的指示操作字典即可。

 

如果你成功按照正確的格式將資料放進字典裡,那你可能會遇到另一個問題:直接 print() 字典出來的東西,格式不符合 json 格式要求,所有的引號都會被 python 使用單引號 ' 表達( json 要的是雙引號 " ),且每個逗號、冒號後面都會有多餘的空格。

 

my_dict = {"apple": {"color": "red", "cost": "100"},
            "banana": {"color": "yellow", "cost": "50"}}

print(my_dict)
# {'apple': {'color': 'red', 'cost': '100'}, 'banana': {'color': 'yellow', 'cost': '50'}}

 

當然,也別期待 pprint 能處理,畢竟它本來就不是用來幹這種事的

from pprint import pprint

my_dict = {"apple": {"color": "red", "cost": "100"},
            "banana": {"color": "yellow", "cost": "50"}}

pprint(my_dict)

# {'apple': {'color': 'red', 'cost': '100'},
#  'banana': {'color': 'yellow', 'cost': '50'}}

 

這時候就可以使用標準庫中的 json 了,可以透過 import json 使用他

 

python 的 json 主要用途有兩個:

  • 讀取一份 json 檔案,並將該檔案的內容轉換成 dict
  • dict 轉換成 json 格式的字符串

 

一般 json 常用的函數可以分成兩種,一類就是讀取 json 格式的檔案、字串,並轉換成 dict,可以透過 loadloads 這兩個函數做到。

  • load 讀取的是文件對象,你得傳入一個路徑給他
  • loads 讀取的是符合 json 格式的字串,只要你給的出來,那不用找檔案也可以。

 

另一種就是這題會用到的,將 dict 轉換成 json 格式的字串、檔案,我們會用到 dumpdumps 這兩個函數。

  • dump 可以將傳入的 dict 轉換成 json 格式的檔案,使用他的話,會在電腦的指定路徑中創建一個新的 json 檔案,裡面放的就是字典的內容。
  • dumps 也可以將傳入的 dict 轉換成 json 格式,但它會回傳一份字串,而不是創建一份新的檔案。

 

理所當然的,這裡是 zerojudge,原則上不允許我們上傳任何會修改系統文件結構、內容的程式碼,所以 dump 不能用,要用 dumps

只需要把我們做出來的字典餵給 dumps,就可以得到一份符合 json 格式的字串了。

 

import json

my_dict = {"apple": {"color": "red", "cost": "100"},
            "banana": {"color": "yellow", "cost": "50"}}

json_text = json.dumps(my_dict)
print(json_text)
# {"apple": {"color": "red", "cost": "100"}, "banana": {"color": "yellow", "cost": "50"}}

 

可以看到輸出的結果是符合 json 格式要求的,所有的引號都是用雙引號 " 表達,但如果就這樣直接輸出的話你還是不能答對這題,因為這題比 json 要求還嚴格,在原本的基礎上更要求所有的逗號 , 和冒號 : 不要有多餘的空白。

 

這也是可以解決的,python 的 json.dumps 允許你微調格式表達的方式,我們可以透過修改 separators 參數,讓這些符號的後方不再有多餘空白,像這樣:

import json

my_dict = {"apple": {"color": "red", "cost": "100"},
            "banana": {"color": "yellow", "cost": "50"}}

json_text = json.dumps(my_dict, separators=(',', ':'))
print(json_text)
# {"apple":{"color":"red","cost":"100"},"banana":{"color":"yellow","cost":"50"}}

 

這樣就可以讓格式不僅僅符合 json 格式要求,同時也符合題目的要求。

 

 

 

 
ZeroJudge Forum