2012-11-15 115 views
1

我试图解码使用JSON字符串解码

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

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

我得到以下错误的堆栈跟踪:

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"} 

但是它的工作原理,如果我没有在数据 - > 40-适用范围标记> html

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

这里有什么问题?

+0

你从哪里得到的JSON字符串?这正是你从'request.POST.get('d'))''? – Keith

+0

该字符串来自Javascript数组。数组的'html'元素来自CKEditor实例。 –

+0

我的意思是你在这里发布的字符串。你怎么得到的?因为你发布的内容工作正常,所以我怀疑POST的内容可能有点不同。 – Keith

回答

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'\'。但最好理解字符串是如何开始的。当你将字符串正文插入到消息中时,你从哪里得到它?

+0

该字符串来自HTML wysiwyg textarea –

+0

好的html部分确实 –

+0

检查如果用户输入了反斜杠符号会发生什么。他们现在变成双反斜杠,没有替换? – Ellioh

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>"'不显而易见的原因,工作在字符串中替换。

+0

好的,听起来像是这样的问题我怎样才能将一个变量转换成一个原始字符串 –

+0

要制作一个字符串“raw”,你只需要在前面加上'r':'r “这是一个原始字符串”'。“”这不是一个原始字符串“'。这不适用于”变量“,如果这是你问的问题:'foo =”bar“; rbar#一个原始字符串' – mgilson

+1

好的,那么如何让这个字符串可以被json.loads()读取? –

0

这个工作对我们:

json.loads(request.POST.get('d').encode('string-escape'))