Im getting json-like string from server. It has \"
instead of normal "
char. When Im converting it with json.loads()
it gives error.
> import json
> from_page = '{"data": "There is start: \"Hello there!\". There is end."}'
> from_page
'{"data": "There is start: "Hello there!". There is end."}'
> json.loads(from_page)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.8/json/__init__.py", line 357, in loads
return _default_decoder.decode(s)
File "/usr/lib/python3.8/json/decoder.py", line 337, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python3.8/json/decoder.py", line 353, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting ',' delimiter: line 1 column 28 (char 27)
When I put \\"
instead of \"
it works fine.
> from_page = '{"data": "There is start: \\"Hello there!\\". There is end."}'
> from_page
'{"data": "There is start: \\"Hello there!\\". There is end."}'
> json.loads(from_page)
{'data': 'There is start: "Hello there!". There is end.'}
But problem is that I cant access data from page directly, so I cant use r""
. I wanted to use repr()
and then convert \
to \\
but repr()
function shows "
instead of \"
, so I cant do anything with that.
> from_page = '{"data": "There is start: \"Hello there!\". There is end."}'
> from_page
'{"data": "There is start: "Hello there!". There is end."}'
> repr(from_page)
'\'{"data": "There is start: "Hello there!". There is end."}\''
What would be the most efficient way to deal with this?
CodePudding user response:
You just can't declare your from_page
variable like that, because escaped quotation mark in a regular string is just a quotation mark:
>>> var = '\"'
>>> len(var)
1
There is only one character in the var
variable - the quotation mark. No backslash to convert to double backslash. So when you declare your from_page
, it's content is just like displayed (note the quotation marks):
'{"data": "There is start: "Hello there!". There is end."}'
^----^ ^----------------^ ^---------------^
You need to declare your string as 'raw', adding an 'r' character in front of it:
>>> from_page = r'{"data": "There is start: \"Hello there!\". There is end."}'
>> from_page
'{"data": "There is start: \\"Hello there!\\". There is end."}'
>>> json.loads(from_page)
{'data': 'There is start: "Hello there!". There is end.'}