【问题标题】:How to prevent escaping certain characters in strings produced by JSON encoder?如何防止转义 JSON 编码器生成的字符串中的某些字符?
【发布时间】:2016-07-01 22:42:31
【问题描述】:

我有一张地图来保存 json 条目。这是我的代码的预览。

mp := map[string]string{"key": "The Knight & Day"}
fmt.Println(mp)
bty3, err := json.Marshal(mp)
fmt.Println(bty3, err)
fmt.Println(string(bty3))

输出如下-

map[key:The Knight & Day]
[123 34 107 101 121 34 58 34 84 104 101 32 75 110 105 103 104 116 32 92 117 48 48 50 54 32 68 97 121 34 125] <nil>
{"key":"The Knight \u0026 Day"}

如何才能保留特殊字符?

【问题讨论】:

  • 这是保留的,只是为了防止各种客户端出现问题而转义。这对 JSON 有效。
  • 我正在尝试从中获取 hmac 值并通过网络发送它。对方抛出hmac与body不匹配的异常。
  • 每一方都需要检查hmac发送的数据,而不是未编码的数据,正是因为这样的同构变化,更不用说可能的安全问题了。但是,如果对方做得不对,您只需要查找并替换转义的字符串。
  • 你能告诉我怎么做吗?查找和替换转义字符串?我不知道接下来我会遇到什么特殊角色。

标签: json go special-characters stringify


【解决方案1】:

encoding/json docs 显示默认转义的字符是&lt;、&gt; 和&amp;。

您可以在此答案中使用strconv.Unquote:How to convert escape characters in HTML tags?

像这样简单的事情也可以:

bty3 = bytes.Replace(bty3, []byte(`\u003c`), []byte("<"), -1)
bty3 = bytes.Replace(bty3, []byte(`\u003e`), []byte(">"), -1)
bty3 = bytes.Replace(bty3, []byte(`\u0026`), []byte("&"), -1)

在即将发布的 Go1.7 版本中,您可以使用 SetEscapeHTML(false) 关闭 json.Encoder 中的转义。

mp := map[string]string{"key": "The Knight & Day"}
var buf bytes.Buffer

enc := json.NewEncoder(&buf)
enc.SetEscapeHTML(false)
enc.Encode(mp)

fmt.Println(&buf)

打印出来的

{"key":"The Knight & Day"}

【讨论】:

猜你喜欢
  • 2013-09-08
  • 2011-03-18
  • 1970-01-01
  • 2015-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多