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',解析返回意外令牌的主要内容,如果未能解决你的问题,请参考以下文章

如何在js中去掉json数据中的转义附

如何去掉Json字符串中反斜杠

javascript 如何去掉空格

如何去掉Json字符串中反斜杠

json_encode在编码字符串时会自动加上双引号,怎么能去掉?

在Javascript中从字符串中去掉html标记