2011-08-29 9 views
5

私はユーザーが編集可能な設定ファイルとしてJSONを使用することがよくあります。不正な形式のJSONは当然json.loadsによって拾われますが、結果として得られるdicts/lists/stringsを調べるまでは見つからないエラーもあります。私は23行目の "無効な値 'foo'のような有用なエラーを出すことができるようにしたいと思っていますが、私のdictを取り戻すと元の行番号へのマッピングが失われてしまいました。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
JSONモジュールがどのあなたはできるオブジェクトをデコードするためのフックを(持っている

は存在しませんしたいが、私はあなたが興味があるなら、あなたがそれを実装する方法のアイデアを持っているもの

私の知る限り...誤)デコード時オブジェクトの検証を行うために使用します。ただし、フックが行番号情報を取得しないため、これで問題は解決されません。この問題は、Python 2.7以降で行単位のエラーメッセージが表示されなくなったため、さらに複雑になりました。純粋なPythonのJSONデコーダからしか入手できず、新しいバージョンでは(はるかに高速な)Cライブラリを使用します。

私たちは解決すべき2つの問題があります。

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を交換する必要があなたの検証を取得するにはほとんど同じことですが、行番号情報も検証ルーチンに渡します。

関連する問題