处理JSON序列化变化的正确方法
我有一个使用Python的SimpleJSON序列化JSON的web服务,还有一个使用Google可视化的javascript/客户端。当我尝试使用Google Data Table的查询方法读取JSON响应时,我得到了一个无效的标签错误 我注意到Google电子表格输出的JSON对象键周围没有引号。我尝试在没有引号的情况下阅读JSON,这很有效。我想知道什么是让SimpleJSON输出使用 query=newgoogle.visualization.Queryhttp://www.myuri.com/api/. 我可以使用正则表达式来删除引号,但这似乎有些草率。我尝试过的javascript JSON解析库在对象键周围没有引号的情况下无法读取JSON语法 以下是一些很好的背景阅读:关于对象键的引号:处理JSON序列化变化的正确方法,json,serialization,google-visualization,simplejson,Json,Serialization,Google Visualization,Simplejson,我有一个使用Python的SimpleJSON序列化JSON的web服务,还有一个使用Google可视化的javascript/客户端。当我尝试使用Google Data Table的查询方法读取JSON响应时,我得到了一个无效的标签错误 我注意到Google电子表格输出的JSON对象键周围没有引号。我尝试在没有引号的情况下阅读JSON,这很有效。我想知道什么是让SimpleJSON输出使用 query=newgoogle.visualization.Queryhttp://www.myuri.
.您确定Google API需要JSON吗?根据我的经验,谷歌的API往往不会像你所描述的那样被大量破坏——可能是他们实际上期望的是一种与JSON类似的不同格式 进一步的探索揭示了以谷歌期望的格式检索数据的说明: 例如,要获取数据源URL 从Google电子表格中,执行以下操作: 以下: 在电子表格中,选择单元格范围。 从菜单中选择“插入”,然后选择“小工具”。 单击右上角的选择器打开小工具的菜单。 选择菜单选项“获取数据源URL”。 我这样做了,并在浏览器中打开了URL。它返回的数据肯定不是JSON:
google.visualization.Query.setResponse(
{requestId:'0',status:'ok',signature:'1464883469881501252',
table:{cols: [{id:'A',label:'',type:'t',pattern:''},
{id:'B',label:'',type:'t',pattern:''}],
rows: [[{v:'a'},{v:'h'}],[{v:'b'},{v:'i'}],[{v:'c'},{v:'j'}],[{v:'d'},{v:'k'}],[{v:'e'},{v:'l'}],[{v:'f'},{v:'m'}],[{v:'g'},{v:'n'}]]}});
看起来结果是由浏览器直接执行的。尝试修改代码以执行以下操作:
# old
return simplejson.dumps ({"requestId": 1, "status": "ok", ...})
# new
json = simplejson.dumps ({"requestId": 1, "status": "ok", ...})
return "google.visualization.Query.setResponse(%r);" % json
无效标签错误通常是由于对JSON字符串进行盲评估,导致属性名称被误认为标签,因为它们具有相同的语法-foo:
eval("{ foo: 42, bar: 43 }"); // Results in invalid label
快速解决方法是确保JSON字符串中有括号括住大括号:
eval("({ foo: 42, bar: 43 })"); // Works
尝试将JSON字符串括在括号中,以查看无效标签错误是否消失。结果是:mod:JSON也会在单引号中的字符串处阻塞。这将解决问题:
在python中将JavaScript对象解析为JSON:
解决方案:
编辑:已审查边缘案例
因此,有人提出,建议的解决方案不能处理所有情况,特别是类似的情况
e、 g.{foo:a句子:就在这里!}将更改为{foo:a句子:就在这里!}
–Jason S 4月12日18:03
为了解决这个问题,我们只需要确保我们实际上使用的是一个键,而不仅仅是字符串中的冒号,所以我们稍微看一下magic后面的逗号或大括号{presence,以确保它正确,如下所示:
字符串中的冒号:
致:
为我工作=
nJoy!将JSON包装在parens中会使其无效。这就是为什么我要说try。这是一个故障排除步骤,尝试看看无效标签错误是否与此有关。此外,这只是一个预处理步骤;您不应该在原始JSON中包含括号。无论如何,这是一个没有意义的点,因为您不应该这样做首先使用eval:我尝试用Query.setResponse包装json。无效标签错误消失了,但现在有些东西超时了。我执行Query.send,在回调中执行response.DataTable。看起来它超时了。不过,我认为这是正确的方向。我不喜欢向下投票的人,但你的解决方案如果JSON对象中存在与您的正则表达式匹配的字符串,则ion会出错,例如,{foo:a句子:就在这里!}将更改为{foo:a句子:就在这里!}如果我们挑剔的话,也许你应该指出我完全无视现有的双引号或转义引号的存在。考虑到三个引号的顺序,看到结果会很有趣。正如你所说,没有一个否定了概念证明。尽管如此,我还是会ge…只要时间允许,我会尽快修复上面提到的缺陷,希望你能回报你的好感,把消极的行为转变成更积极的行为。=当然!发表评论提醒我+我会相应地投票。
>>> from re import sub
>>> import json
>>> js = "{ a: 'a' }"
>>> json.loads(sub("'", '"', sub('\s(\w+):', r' "\1":', js)))
{u'a': u'a'}
>>> 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!'}
>>> 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!"}
{ name: 'chuck',
description: 'Chuck Norris joke dispenser.',
'dist-tags': { latest: '0.0.3' },
versions: '0.0.3',
maintainers: 'qard ',
time: { '0.0.3': '2011-08-19T22:00:54.744Z' },
author: 'Stephen Belanger ',
repository:
{ type: 'git',
url: 'git://github.com/qard/chuck.git' },
version: '0.0.3',
dependencies: { 'coffee-script': '>= 1.1.1' },
keywords:
[ 'chuck',
'norris',
'jokes',
'funny',
'fun' ],
bin: { chuck: './bin/chuck' },
main: 'index',
engines: { node: '>= 0.4.1 < 0.5.0' },
devDependencies: {},
dist:
{ shasum: '3af700056794400218f99b7da1170a4343f355ec',
tarball: 'http://registry.npmjs.org/chuck/-/chuck-0.0.3.tgz' },
scripts: {},
directories: {},
optionalDependencies: {} }
{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 joke dispenser.',
u'devDependencies': {},
u'directories': {},
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'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'version': u'0.0.3',
u'versions': u'0.0.3'}