我正在嘗試將什么應該是 JSON 決議為 Python dict。但是,我正在使用的 JSON 檔案不是有效的 JSON,因為鍵值對周圍經常會缺少引號。HJSON 似乎是我正在尋找的東西,但是如果我嘗試傳遞除null整數或任何整數以外的任何值,我發現它會出錯。
使用一些我必須使用的“JSON”值來處理它:
import hjson
# EXAMPLE 1
working = hjson.loads('{ date_closed: null }') # <- THIS WORKS!
print(working)
OrderedDict([('date_closed', None)])
# EXAMPLE 2
works_too = hjson.loads('{ date_closed: 42 }') # <- THIS WORKS!
print(works_too)
OrderedDict([('date_closed', 42)])
# EXAMPLE 3
not_working = hjson.loads('{ date_closed: yes }') # <- ERRORS!
~/hjson/decoder.py in scanKeyName(s, end, encoding, strict)
278
279 if ch == '':
--> 280 raise HjsonDecodeError("Bad key name (eof)", s, end);
281 elif ch == ':':
282 if begin == end:
HjsonDecodeError: Bad key name (eof): line 1 column 21 (char 20)
# EXAMPLE 4
# Using different key name
also_not_working = hjson.loads('{ date_opened: yes }') # <- ERRORS with identical error message as above
# Different value name, showing it's not a 'key' error but a 'value' error
this_works = hjson.loads('{ date_opened: null }') # <- THIS WORKS!
print(this_works)
OrderedDict([('date_opened', None)])
# EXAMPLE 5
doesnt_work = hjson.loads('{ date_opened: None }') # <- ERRORS with identical error message as above
錯誤訊息似乎不正確。這不是
key name有問題的(因為相同的密鑰有時會起作用),而是value name.似乎能夠被 HJSON 決議的唯一值是整數(值
42有效)和null值。
我在這里錯過了什么?
uj5u.com熱心網友回復:
我只是在擺弄這個并查看HJSON 規范,并基于那里的示例(也在嘗試部分下),并且相信我想通了。它沒有明確解釋,如果我錯了,有人可以糾正我,但看起來 HJSON 需要左大括號{和右大括號,并且}在單獨的行上;至少,無論如何,這就是我認為 Python 實作所遵循的。例如,這是一個簡單的用法,我能夠確認它似乎決議沒有問題:
print(hjson.loads('''
{
testing_123: hello world
}
'''))
# now it works! prints out:
# OrderedDict([('testing_123', 'hello world')])
因此,在您的情況下,我認為修復它的最簡單方法(即,如果您不想手動將大括號放在單獨的行上)是創建一個包裝函式loads,定義如下:
import hjson
def loads(string, decoder=hjson.loads):
return decoder(string.replace('{', '{\n').replace('}', '\n}'))
現在,我可以確認上述兩種情況現在似乎都按原先預期進行了決議:
working_now = loads('{ date_closed: yes }')
print(working_now)
also_working = loads('{ date_opened: yes }') # <- ERRORS with identical error message as above
print(also_working)
出去:
OrderedDict([('date_closed', 'yes')])
OrderedDict([('date_opened', 'yes')])
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/367704.html
