Javascript - 去掉 JSON 字符串中出现的 u',解析返回意外令牌
Posted
技术标签:
【中文标题】Javascript - 去掉 JSON 字符串中出现的 u\',解析返回意外令牌【英文标题】:Javascript - strip out occurrences of u' in JSON string, parse is returning unexpected tokenJavascript - 去掉 JSON 字符串中出现的 u',解析返回意外令牌 【发布时间】:2014-02-14 15:19:05 【问题描述】:我在数据库中有一个文本字段,其中包含 python json.dumps(list_instance)
操作的结果。因此,内部字段具有u'
前缀,并破坏了浏览器的JSON.parse()
功能。
JSON 字符串的一个例子是
"density": "u'Penobscot': 40.75222856500098, u'Sagadahoc':
122.27083333333333, u'Lincoln': 67.97977755308392, u'Kennebec':
123.12237174095878, u'Waldo': 48.02117802779616, u'Cumberland':
288.9285325791363, u'Piscataquis': 3.9373586457405247, u'Hancock':
30.698239582715903, u'Washington': 12.368718341168325, u'Aroostook':
10.827378163074039, u'York': 183.47612497543722, u'Franklin':
16.89330963710371, u'Oxford': 25.171240748402518, u'Somerset':
12.425648288323485, u'Knox': 108.48302300109529, u'Androscoggin':
208.75502815768303"
我想做的是用'
(单引号)替换那些出现的u'
。我试过了
function renderValues(data)
var pop = JSON.parse(data.density.replace(/u'/g, "'"));
但我总是收到unexpected token '
异常。由于许多可能的关键字段可能包含u
,因此仅删除该字符是不可行的。如何找到u'
的所有实例并替换为'
而不会出现异常?
【问题讨论】:
你是不是错过了 JOSN 字符串中最外层的 and
?
@anubhava,不。这是来自 Django 模型的序列化返回的示例。我没有做一个完整的数据转储,而是展示了一个整体数据格式的样本。
好吧,在这种情况下,当我用你的代码尝试上面的 JSON 字符串时没有错误。
@anubhava,你用什么浏览器检查的?我在 ubuntu 上使用 chrome 32。事实证明,用双引号替换单引号解决了这个问题。
我在chrome上测试过,也可以生成jsfiddle。
【参考方案1】:
接受的解决方案是错误的。您的代码失败,因为该字符串不是有效的 JSON。通过替换来修复伪 JSON 字符串是错误的。
您需要做的是修复生成损坏的 JSON 字符串的 python 代码,我很确定它是 str() 或 unicode() 应该什么都没有。您作为键“密度”的值是字符串而不是字典,因此,python 会返回如下内容:
"density": "a string that looks like JSON but it is in fact a string reprensentation of a dictionary"
json.dumps
函数将始终返回有效的 JSON 字符串。
解决这个问题,您就不必使用肮脏的字符串替换或其他任何东西。
编辑
检查以下sn-p。在那里你可以看到 u'...' 只是一个 unicode 对象的 python 可读表示,与 JSON 序列化没有任何关系。
>>> import json
>>> data = u'name': u'Manuel', u'age': 26
>>> print data
u'age': 26, u'name': u'Manuel' # this is the python representation of a dictionary
>>> print json.dumps(data)
"age": 26, "name": "Manuel" # this is a valid JSON string
JSON 格式不正确,就这么简单。
【讨论】:
你永远不会知道,他可能无法访问生成 JSON 的服务器,这可以解释他的方法的原因。 我接受了@tenub 的回答,因为它让我无需进入数据存储即可解决问题。您缺少的事实是 dict 键本身以u
为前缀,因此不受任何 json.dumps()
操作的影响。
That u'..' 只是 unicode 对象的 python 表示,与字典的 JSON 序列化完全无关。键和值实际上都不是以“u”为前缀的。【参考方案2】:
更新的解决方案:replace(/u'/g, "'"));
=> replace(/u'(?=[^:]+')/g, "'"));
。
经过以下测试:
"u'Penobscot': 40.75222856500098, u'Sagadahoc': 122.27083333333333, u'Lincoln': 67.97977755308392, u'Kennebec': 123.12237174095878, u'Waldo': 48.02117802779616, u'Cumberland': 288.9285325791363, u'Piscataquis': 3.9373586457405247, u'Hancock': 30.698239582715903, u'Timbuktu': 12.368718341168325, u'Aroostook': 10.827378163074039, u'York': 183.47612497543722, u'Franklin': 16.89330963710371, u'Oxford': 25.171240748402518, u'Somerset': 12.425648288323485, u'Knox': 108.48302300109529, u'Androscoggin': 208.75502815768303".replace(/u'(?=[^:]+')/g, "'");
结果:
"'Penobscot': 40.75222856500098, 'Sagadahoc': 122.27083333333333, 'Lincoln': 67.97977755308392, 'Kennebec': 123.12237174095878, 'Waldo': 48.02117802779616, 'Cumberland': 288.9285325791363, 'Piscataquis': 3.9373586457405247, 'Hancock': 30.698239582715903, 'Timbuktu': 12.368718341168325, 'Aroostook': 10.827378163074039, 'York': 183.47612497543722, 'Franklin': 16.89330963710371, 'Oxford': 25.171240748402518, 'Somerset': 12.425648288323485, 'Knox': 108.48302300109529, 'Androscoggin': 208.75502815768303"
【讨论】:
如果你的车库里有一辆车漏油,最好是漏油而不是在它下面放一个桶。 我的意思是,最好修复泄漏...我不能再编辑了。 这不是一个好的解决方案,因为它会删除任何字符串中的尾随 u,例如,如果您的字符串是u'Timbuktu'
,那么它将以 'Timbukt'
结尾。如其他地方所述,用户显示的输入不是 JSON,需要修复生成而不是尝试使用建议的解决方案等创可贴。
你还会得到像 "Washington'
这样的带有不匹配引号字符的东西。
对于其他地方的问题,这是一个草率的解决方案。基本上,治疗症状而不是根本原因。失败的完美秘诀。【参考方案3】:
答案有点旧,但如果无法更改或访问服务器响应,请尝试:
var strExample = 'att1':u'something with u';
strExample.replace(/u'[\|\,]/g, "ç'").replace(/u'/g, "'").replace(/ç'/g, "u'");
//'att1':'something with u';
第一个替换将处理对象中字符串尾部的 u' 将其更改为 'ç' 字符
然后从 phyton unicode 中删除 u,最后像原来一样将其更改为 u'
【讨论】:
【参考方案4】:我遇到了类似的问题,并制作了这个正则表达式,即使值也有它们,也能找到所有 u。
replace(/(?!\s|:)((u)(?='))/g, "")
我发现,接受的答案错过了这些事件。
我知道 OP 的值没有 'u',只有键,但我认为这也可能有用 :)
【讨论】:
以上是关于Javascript - 去掉 JSON 字符串中出现的 u',解析返回意外令牌的主要内容,如果未能解决你的问题,请参考以下文章