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 に答える