在PythonJSON.dumps(数组)中取消显示单个unicode字符的干净方法?
我需要将一些数据发送到我不拥有或不运行的服务器。数据必须通过HTTP POST以表单参数形式发送。键必须是“logs”,值必须是JSON数组。此数组的每个元素都是一个CSV字符串,由unicode表示的在PythonJSON.dumps(数组)中取消显示单个unicode字符的干净方法?,python,json,string,unicode,escaping,Python,Json,String,Unicode,Escaping,我需要将一些数据发送到我不拥有或不运行的服务器。数据必须通过HTTP POST以表单参数形式发送。键必须是“logs”,值必须是JSON数组。此数组的每个元素都是一个CSV字符串,由unicode表示的Ctrl-a,\u0001(不是文字字符)分隔 当我通过JSON.dumps将CSV字符串数组转换为JSON数组时,它会隐式转义一些字符(例如“) 问题:json.dumps还隐式转义我的CSV分隔符\u0001,将其更改为\\u0001,这会导致服务器拒绝我的数据。要解决此问题,我手动“取消”-
Ctrl-a
,\u0001
(不是文字字符)分隔
当我通过JSON.dumps
将CSV字符串数组转换为JSON数组时,它会隐式转义一些字符(例如“
)
问题:json.dumps
还隐式转义我的CSV分隔符\u0001
,将其更改为\\u0001
,这会导致服务器拒绝我的数据。要解决此问题,我手动“取消”-转义它: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)
注意:Python2.7只需在列表中使用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"))
(其中序列化的_日志是上面的json.dumps
结果)
见:(蟒蛇2)我不明白你为什么不发送普通字节…为什么必须转义?@JoranBeasley再次你好Joran,谢谢你回来。我想知道同样的事情。这是服务强加的要求,我对此没有控制权。我同意,这很奇怪。看起来它仍然在这里转义…只有一个…di您是否删除了其他问题?我怀疑您误解了服务文档…@JoranBeasley反斜杠被转义。我希望通过HTTP发送的字符是
\u0001
,而不是\\u0001
,u“\u0001”
和”\\u0001之间的区别是什么“
?哦,等等,你是不是在蟒蛇3中。。。在python3中,你不需要u逃跑u“s”
只需确保它是一个unicode字符串。。。“s”只是一个bytestring(在python3中会发生变化),我在python2中,很抱歉我应该指定它