json.Marshal被转义,json.NewEncoder代替

package main

import (
	"encoding/json"
	"fmt"
)

func main() {
	data := map[string]string{"key": "value & more"}
	jsonData, err := json.Marshal(data)
	if err != nil {
		panic(err)
	}
	fmt.Println(string(jsonData)) // 输出: {"key":"value \u0026 more"}
}

为什么会自动转义

在您的代码中,json.Marshal 函数默认会对特殊字符进行转义。这是出于安全考虑,以确保生成的 JSON 是有效的,并且可以在各种环境中安全使用。特别是对于 & 字符,它被转义为 \u0026,因为在某些上下文中(如 HTML),& 可能会被误解为实体引用的开始。

如何避免转义

如果您希望在 JSON 输出中保留原始字符而不进行转义,可以使用 json.Encoder 并设置 SetEscapeHTML(false)。这里有一个修改后的版本,可以实现您想要的效果:

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
)

func main() {
    data := map[string]string{"key": "value & more"}
    
    var buf bytes.Buffer
    encoder := json.NewEncoder(&buf)
    encoder.SetEscapeHTML(false)
    
    err := encoder.Encode(data)
    if err != nil {
        panic(err)
    }
    
    fmt.Print(buf.String()) // 输出: {"key":"value & more"}
}

在这个版本中:

  1. 我们创建了一个 bytes.Buffer 来存储 JSON 输出。
  2. 使用 json.NewEncoder 创建一个新的 encoder。
  3. 调用 SetEscapeHTML(false) 来禁用 HTML 转义。
  4. 使用 encoder.Encode(data) 来编码数据。
  5. 最后,我们打印 buffer 的内容。

这样,& 字符就不会被转义,输出将会是 {"key":"value & more"}

注意事项

虽然这种方法可以避免转义,但请注意,这可能会在某些情况下产生不安全或无效的 JSON。例如,如果您的数据中包含 JSON 特殊字符(如引号或反斜杠),可能会导致问题。因此,只有在您确定数据内容安全且需要原始输出时,才应使用这种方法。

在大多数情况下,使用默认的转义行为是更安全的选择,特别是当 JSON 可能被用于 Web 应用程序或其他可能对特殊字符敏感的环境中时。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值