2011-08-29 18 views
5

我經常使用JSON作爲用戶可編輯的配置文件。格式不正確的JSON當然是由json.loads爲我提供的,但有時會出現錯誤,直到我經歷所產生的字符串/列表/字符串時纔會發現。我希望能夠給出有用的錯誤,如「第23行的無效值'foo'」,但是當我得到我的字典時,我已經失去了對原始行號的映射。Python:JSON解碼庫,可以解碼項目與原始行號關聯?

似乎有人可能寫了一個JSON解析器,該解析器使用一些有關在輸入文本中出現的位置的元數據來標記每個輸出對象:python中是否存在這樣的事情?

例子:

1. [{"foo": "x"}, 
2. {"bar": "y"}] 

解析以上後,我發現,「Y」其實不是「酒吧」一個法律價值,我想知道,它的行號來2.

+0

不幸的是我相信Python沒有這樣的lib,或者至少我沒有在主要的JSON庫中看到這個特性(json,simplejson,Jansson) –

回答

-1

如果您使用json.load()並傳入打開的文件句柄,則您收到的任何錯誤消息都將包含行號和列號。如果例外是ValueError,則關聯的消息應該適合轉發給用戶。

+0

當然,我已經在JSON級別獲得了語法錯誤的好消息。這個問題是關於處理錯誤,直到我通過結果對象時才發現。 – kdt

+1

對不起,誤解了這個問題。 –

0

AFAIK你想要的東西是不存在的,但我有一個想法,如果你有興趣,你可以如何實現它?

json模塊具有解碼對象,你能鉤(誤)用來做解碼時對象驗證。但是這不會解決你的問題,因爲掛鉤沒有獲得行號信息。這個問題更加複雜,因爲您不再在Python 2.7+中獲得逐行錯誤消息。您只能從純Python JSON解碼器獲取它們,而較新版本使用(速度更快)的C庫。

所以我們有兩個問題需要解決。

1)你可以通過繼承json.JSONDecoder像這樣使用純Python解碼器:

class PyDecoder(json.JSONDecoder): 
    def __init__(self, encoding=None, object_hook=None, parse_float=None, 
      parse_int=None, parse_constant=None, strict=True, 
      object_pairs_hook=None): 
     super(PyDecoder, self).__init__(encoding, object_hook, parse_float, 
             parse_int, parse_constant, strict) 
     self.scan_once = json.scanner.py_make_scanner(self) 

2)爲了讓您的驗證,你需要與不漂亮的方法來代替json.decoder.JSONObject同樣的事情,但也傳遞行號信息到您的驗證例程。