事实证明: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:"a sentence: 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',
网址:'git://github.com/qard/chuck.git'},
版本:'0.0.3',
依赖项:{ 'coffee-script': '>= 1.1.1' },
关键词:
['查克',
'诺里斯',
“笑话”,
'有趣的',
'乐趣' ],
bin: { 夹头: './bin/chuck' },
主要:'索引',
引擎:{节点:'>= 0.4.1 < 0.5.0'},
devDependencies:{},
分布:
{ shasum: '3af700056794400218f99b7da1170a4343f355ec',
压缩包:' 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'Chuck Norris 笑话分配器。',
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'engines': {u'node': 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'optionalDependencies': {},
u'repository': {u'type': u'git', u'url': u'git://github.com/qard/chuck.git'},
u'脚本':{},
u'time': {u'0.0.3': u'2011-08-19T22:00:54.744Z'},
u'版本':u'0.0.3',
u'版本':u'0.0.3'}
为我工作=)
开心!