1

我正在尝试使用解码 JSON 字符串

json.loads(request.POST.get('d'))

其中 d 是一个包含 JSON 字符串的 POST 参数。

我在堆栈跟踪中收到以下错误:

ValueError: Unterminated string starting at: line 1 column 22 (char 22)

这是 JSON 字符串:

{"data":{"40":{"html":"<span style=\"color:#ffffff;\">test</span>","background":"transparent"},"41":{"html":"","background":"transparent"},"42":{"html":"","background":"transparent"}},"action":"save"}

但是,如果我不在 data->40->html 中应用 span 标签,它会起作用

{"data":{"40":{"html":"test","background":"transparent"},"41":{"html":"","background":"transparent"},"42":{"html":"","background":"transparent"}},"action":"save"}

这里有什么问题?

4

3 回答 3

1

我想源字符串中有反斜杠。

当我解析

"""{"data":{"40":{"html":"<span style=\"color:#ffffff;\">test</span>","background":"transparent"},"41":{"html":"","background":"transparent"},"42":{"html":"","background":"transparent"}},"action":"save"}""" 

使用 json.loads(),它会失败并出现类似的错误。

但是,当我禁用转义序列(r'' 字符串文字)时,它可以工作:

r"""{"data":{"40":{"html":"<span style=\"color:#ffffff;\">test</span>","background":"transparent"},"41":{"html":"","background":"transparent"},"42":{"html":"","background":"transparent"}},"action":"save"}"""

显然,'\"'在您的字符串中被转义并导致在'"'您构造字符串时,可能在 JS(?) 中。还没有看到构建它的代码,但尝试添加一个额外的反斜杠:'\\"'

更新:您可以在字符串中r'\'替换为。r'\\'但最好先了解字符串的外观。当您将字符串正文插入到您的消息中时,您是从哪里得到的?

于 2012-11-15T05:55:40.200 回答
0

你怎么知道那是你得到的字符串?这个对我有用:

>>> ss = r'{"data":{"40":{"html":"<span style=\"color:#ffffff;\">test</span>","background":"transparent"},"41":{"html":"","background":"transparent"},"42":{"html":"","background":"transparent"}},"action":"save"}'
>>> json.loads(ss)
{u'action': u'save', u'data': {u'42': {u'html': u'', u'background': u'transparent'}, u'40': {u'html': u'<span style="color:#ffffff;">test</span>', u'background': u'transparent'}, u'41': {u'html': u'', u'background': u'transparent'}}}

请注意,我使用了一个原始字符串,ss因为否则\"只会"在字符串中被替换,导致'"<span style="color:#ffffff;">test</span>"'由于明显的原因它不起作用。

于 2012-11-15T05:55:55.827 回答
0

这对我们有用:

json.loads(request.POST.get('d').encode('string-escape'))
于 2015-11-16T14:15:14.950 回答