Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PythonJSON.dumps(数组)中取消显示单个unicode字符的干净方法?_Python_Json_String_Unicode_Escaping - Fatal编程技术网

在PythonJSON.dumps(数组)中取消显示单个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,这会导致服务器拒绝我的数据。要解决此问题,我手动“取消”-

我需要将一些数据发送到我不拥有或不运行的服务器。数据必须通过HTTP POST以表单参数形式发送。键必须是“logs”,值必须是JSON数组。此数组的每个元素都是一个CSV字符串,由unicode表示的
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中,很抱歉我应该指定它