【问题标题】:Clean way to unescape a single unicode char in python json.dumps(array)?在 python json.dumps(array) 中取消单个 unicode char 的干净方法?
【发布时间】:2018-11-16 00:02:07
【问题描述】:

我需要将一些数据发送到我不拥有或操作的服务器。数据必须通过 HTTP POST 在表单参数中发送。键必须是“日志”,值必须是 JSON 数组。该数组的每个元素都是一个 CSV 字符串,由Ctrl-A\u0001unicode 表示不是文字字符)分隔。

当我通过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)

注意:python 2.7

【问题讨论】:

  • 我不明白你为什么不只是发送普通字节......为什么它必须被转义?
  • @JoranBeasley 你好 Joran,感谢你回来。我想知道同样的事情。这是服务强加的要求,我无法控制。我同意,这很奇怪。
  • repl.it/@JoranBeasley/SoreGrimQuotient 看起来它仍然在这里转义......只有一个......你删除了你的另一个问题吗?
  • 我怀疑您误解了服务文档...
  • @JoranBeasley 反斜杠被转义了。我想通过 HTTP 发送的字符是 \u0001,而不是 \\u0001

标签: python json string unicode escaping


【解决方案1】:

只在列表中使用 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)

【讨论】:

  • u"\u0001""\\u0001"有什么区别?
  • 哦,等等,你在 python3 中吗……在 python3 中,你不需要 u 转义……u"s" 只是确保它是一个 unicode 字符串……“s”只是一个字节串(在改变的python3)
  • 我在 python 2 中,抱歉我应该指定
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 2014-01-15
  • 1970-01-01
  • 1970-01-01
  • 2011-09-08
  • 1970-01-01
相关资源
最近更新 更多