2012-11-15 120 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'))