Python 도구로 Twitter 데이터를 검색하고 JSON 형식으로 내 디스크에 덤프합니다. 큰 따옴표로 묶인 트윗에 대한 전체 데이터 문자열이 의도하지 않게 이스케이프되는 것을 발견했습니다. 또한 실제 JSON 형식의 모든 큰 따옴표는 백 슬래시로 이스케이프됩니다.
그들은 다음과 같이 보입니다 :
“{\”created_at \ “: \”8 월 8 일 금요일 11:04:40 +0000 2014 \ “, \”id \ “: 497699913925292032,
어떻게 피할 수 있습니까? 그것은해야한다:
{ “created_at”: “2014 년 8 월 8 일 금요일 11:04:40 +0000″…..
내 파일 아웃 코드는 다음과 같습니다.
with io.open('data'+self.timestamp+'.txt', 'a', encoding='utf-8') as f:
f.write(unicode(json.dumps(data, ensure_ascii=False)))
f.write(unicode('\n'))
의도하지 않은 이스케이프로 인해 이후 처리 단계에서 JSON 파일을 읽을 때 문제가 발생합니다.
답변
JSON 문자열을 이중 인코딩하고 있습니다. data
이다 이미 JSON 문자열, 그리고 인코딩 할 필요가 없습니다 다시 :
>>> import json
>>> not_encoded = {"created_at":"Fri Aug 08 11:04:40 +0000 2014"}
>>> encoded_data = json.dumps(not_encoded)
>>> print encoded_data
{"created_at": "Fri Aug 08 11:04:40 +0000 2014"}
>>> double_encode = json.dumps(encoded_data)
>>> print double_encode
"{\"created_at\": \"Fri Aug 08 11:04:40 +0000 2014\"}"
파일에 직접 작성하십시오.
with open('data{}.txt'.format(self.timestamp), 'a') as f:
f.write(data + '\n')
답변
이 원치 않는 이스케이프가 발생할 수있는 또 다른 상황은 json.dumps ()의 사전 처리 된 출력에서 json.dump ()를 사용하려는 경우입니다. 예를 들면
import json, sys
json.dump({"foo": json.dumps([{"bar": 1}, {"baz": 2}])},sys.stdout)
결과적으로
{"foo": "[{\"bar\": 1}, {\"baz\": 2}]"}
이를 방지하려면 json.dumps ()의 출력이 아닌 사전을 전달해야합니다.
json.dump({"foo": [{"bar": 1}, {"baz": 2}]},sys.stdout)
원하는 출력
{"foo": [{"bar": 1}, {"baz": 2}]}
(왜 json.dumps ()로 내부 목록을 사전 처리하겠습니까? 글쎄요, 다른 것에서 내부 목록을 만드는 또 다른 함수가 있었는데 json 객체를 반환하는 것이 합리적이라고 생각했습니다. 그 기능 … 틀렸어.)