13

simplejson一重引用符が原因で'sloads関数が失敗することに気付きました。

>>> import simplejson as json
>>> json.loads("\"foo\"")
'foo'
>>> json.loads("\'foo\'")
Traceback (most recent call last):
...
ValueError: No JSON object could be decoded

私は次のようなものを解析しています:foo = ["a", "b", "c"]テキストファイルから Python のリストに変換し、foo = ['a', 'b', 'c']. 自動でリスト化するのにsimplejson便利です。foo

loads入力を破壊することなく、単一引用符を受け入れるか、単一引用符を自動的に二重引用符に置き換えるにはどうすればよいですか? ありがとう。

4

3 に答える 3

43

ジョブに適切なツールを使用します。JSONではなくPythonを解析しているため、ast.literal_eval()代わりに次を使用します。

>>> import ast
>>> ast.literal_eval('["a", "b", "c"]')
['a', 'b', 'c']
>>> ast.literal_eval("['a', 'b', 'c']")
['a', 'b', 'c']
>>> ast.literal_eval('["mixed", \'quoting\', """styles"""]')
['mixed', 'quoting', 'styles']
  • JSONドキュメントは、文字列に常に二重引用符を使用し、16\uhhhh進エスケープ構文にUTF-16を使用{...}し、キーと値のペアのオブジェクトを持ち、キーは常に文字列であり、シーケンスは常に[...]リストであり、、と値を使用nulltrueますfalse。小文字のブール値に注意してください。数値は整数と浮動小数点の形式で提供されます。

  • Pythonでは、文字列表現は一重引用符と二重引用符を使用でき、Unicodeエスケープの使用\uhhhh\Uhhhhhhhh形式(UTF-16サロゲートペアなし)、{...}表示構文の辞書は文字列だけでなく多くの異なるタイプのキーを持つことができ、シーケンスはリスト([...])にすることができますがタプル((...))も使用します。または、他の種類のコンテナーを引き続き使用することもできます。PythonにはNone、、TrueおよびFalse(タイトルケース!)があり、数値は整数、浮動小数点数、および複雑な形式で提供されます。

一方を他方と混同すると、デコードが成功したが、絵文字などのエスケープされた非BMPコードポイントなど、データが誤って解釈された場合に、解析エラーまたは微妙な問題が発生する可能性があります。それらをデコードするには、必ず正しい方法を使用してください。そして、ほとんどの場合、Python構文データがある場合、誰かが実際に間違ったエンコード方法を使用し、誤ってPython表現を生成しただけです。その場合、ソースを修正する必要があるかどうかを確認してください。通常、出力は、代わりに使用されるべきstr(object)場所を使用して生成されました。json.dumps(obj)

于 2013-01-15T21:22:15.927 に答える