Чистый способ удалить один символ Юникода в python json.dumps (array)? - PullRequest
0 голосов
/ 16 ноября 2018

Мне нужно отправить некоторые данные на сервер, которым я не владею или не работаю.Данные должны быть отправлены в параметре формы через HTTP POST.Ключ должен быть «logs», а значение должно быть массивом JSON.Каждый элемент этого массива представляет собой строку CSV, ограниченную представлением в юникоде из Ctrl-A, \u0001 ( не литеральным символом).

Когда япреобразовать мой массив строк CSV в массив JSON через json.dumps, он неявно экранирует некоторые символы (например, ").

Проблема: json.dumps также неявно экранирует мой разделитель CSV \u0001, изменяя его на \\u0001, что заставляет сервер отклонять мои данные.Чтобы обойти это, я вручную "un" -cape это: s.replace('\\\\u0001', '\\u0001')

Вопрос: Есть ли потенциальные последствия использования этого хакерского обходного пути?Есть ли более элегантный способ для меня решить эту проблему?

# Ctrl-A (\u0001) delimited CSV strings
logs = ['VAL1\\u0001{"key":"VAL2"}', 'VAL1\\u0001{"key":"VAL2"}'] 

# Serialize as JSON (it implicitly escapes chars, including Ctrl-A)
serialized_logs = json.dumps(logs)

# replace '\\u0001' with '\u0001' (unescape it)
# this seems HACKY -- is there a better way to handle this?
serialized_logs = serialized_logs.replace('\\\\u0001', '\\u0001')

# send over HTTP
params = { 'logs' : serialized_logs }
response = requests.post(url, data=params)

Примечание: python 2.7

1 Ответ

0 голосов
/ 16 ноября 2018

просто используйте строки Unicode в вашем списке и не экранируйте Unicode

logs2 = [u'VAL1\u0001{"key":"VAL2"}', u'VAL1\u0001{"key":"VAL2"}'] 
serialized_logs2 = json.dumps(logs2)

следует поступить правильно, вы можете проверить это по

print(serialized_logs2 == serialized_logs.replace("\\\\u0001","\\u0001"))

(где serialized_logs - ваш json.dumps результат выше)

см .: https://repl.it/@JoranBeasley/SoreGrimQuotient (python2)

...