Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
处理JSON序列化变化的正确方法_Json_Serialization_Google Visualization_Simplejson - Fatal编程技术网

处理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.

我有一个使用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语法

以下是一些很好的背景阅读:关于对象键的引号:


.

您确定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'}