結局のところ、:mod:jsonは一重引用符で囲まれた文字列でもチョークします。ただし、これは物事を整理します:
Python で JavaScript オブジェクトを JSON として解析します。
解決:
>>> from re import sub
>>> import json
>>> js = "{ a: 'a' }"
>>> json.loads(sub("'", '"', sub('\s(\w+):', r' "\1":', js)))
{u'a': u'a'}
編集:(エッジケースのレビュー)
そのため、提案された解決策がすべてのケース、特に次のようなものに対処するわけではないことが提起されました
例: {foo: "文: right here!"} は {"foo": "a "sentence": right here!"} に変更されます
– Jason S 4 月 12 日 18:03
これを解決するには、文字列内の単なるコロンではなく、実際にキーを操作していることを確認する必要があるため、魔法の背後にあるカンマ (,) または中括弧 ({) の存在を示唆するために少し調べます。次のように、適切であることを確認します。
文字列のコロン:
>>> js = "{foo: 'a sentence: right here!'}"
>>> json.loads(sub("'", '"', sub('(?<={|,)\s*(\w+):', r' "\1":', js)))
{u'foo': u'a sentence: right here!'}
もちろん、これは次のことと同じです:
>>> js = "{foo: 'a sentence: right here!'}"
>>> json.loads(sub('(?<={|,)\s*(\w+):', r' "\1":', js).replace("'",'"'))
{u'foo': u'a sentence: right here!'}
しかし、これが唯一の欠陥ではないことを指摘しました。
エスケープされた引用符についても懸念がある場合は、文字列を構成するものについてもう少し具体的にする必要があります。最初の引用符は中括弧 ({)、スペース (\s) またはコロン (:) のいずれかに続きますが、最後に一致する引用符はコンマ (,) または閉じ中括弧 (}) の前に来ます。次のように、その間のすべてを同じ文字列の一部として指定します。
文字列内の追加の引用符:
>>> js = "{foo: 'a sentence: it\'s right here!'}"
>>> json.loads(
... sub("(?<=\s|{|:)'(.*?)'(?=,|})",
... r'"\1"',
... sub('(?<={|,)\s*(\w+):', r' "\1":', js))
... )
{u'foo': u"a sentence: it's right here!"}
より多くのエッジ ケースが明らかになり、解決されるので、このスペースをご覧ください。別のものを見つけることができますか?
または、おそらくもっと複雑なものとして、 によって返される現実世界の例npm view
:
から:
{ 名前: 'チャック',
説明: 'チャック・ノリスのジョーク ディスペンサー',
'dist-tags': { 最新: '0.0.3' },
バージョン: '0.0.3',
メンテナ: 'qard',
時間: { '0.0.3': '2011-08-19T22:00:54.744Z' },
著者:「スティーブン・ベレンジャー」、
リポジトリ:
{ タイプ: 'git',
URL: 'git://github.com/qard/chuck.git' },
バージョン: '0.0.3',
依存関係: { 'coffee-script': '>= 1.1.1' },
キーワード:
[「チャック」、
「ノリス」、
「冗談」、
'面白い'、
'楽しい' ]、
ビン: { チャック: './ビン/チャック' },
メイン: 'インデックス',
エンジン: { ノード: '>= 0.4.1 < 0.5.0' },
devDependencies: {},
距離:
{ shasum: '3af700056794400218f99b7da1170a4343f355ec',
tarball: ' http://registry.npmjs.org/chuck/-/chuck-0.0.3.tgz ' },
スクリプト: {},
ディレクトリ: {},
オプションの依存関係: {} }
に:
{u'author': u'Stephen Belanger ',
u'bin': {u'chuck': u'./bin/chuck'},
u'dependencies': {u'coffee-script': u'>= 1.1.1'},
u'description': u'チャック・ノリスのジョーク ディスペンサー。',
u'devDependencies': {},
u'ディレクトリ': {},
u'dist': {u'shasum': u'3af700056794400218f99b7da1170a4343f355ec',
u'tarball': u' http://registry.npmjs.org/chuck/-/chuck-0.0.3.tgz '},
u'dist-tags': {u'latest': u'0.0.3'},
u'エンジン': {u'ノード': u'>= 0.4.1 < 0.5.0'},
u'keywords': [u'chuck', u'norris', u'jokes', u'funny', u'fun'],
u'main': u'index',
u'maintainers': u'qard ',
u'name': u'chuck',
u'optionalDependencies': {},
u'repository': {u'type': u'git', u'url': u'git://github.com/qard/chuck.git'},
u'scripts': {},
u'time': {u'0.0.3': u'2011-08-19T22:00:54.744Z'},
u'バージョン': u'0.0.3',
u'versions': u'0.0.3'}
私のために働く=)
nJoy!