golang json.Marshal 特殊html字符被转义的解决方法

 更新时间:2019年08月26日 09:44:36   作者:李浩的life  
今天小编就为大家分享一篇golang json.Marshal 特殊html字符被转义的解决方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

go语言提供了json的编解码包,json字符串作为参数值传输时发现,json.Marshal生成json特殊字符<、>、&会被转义。

type Test struct {
  Content   string
}
func main() {
  t := new(Test)
  t.Content = "http://www.baidu.com?id=123&test=1"
  jsonByte, _ := json.Marshal(t)
  fmt.Println(string(jsonByte))
}
{"Content":"http://www.baidu.com?id=123\u0026test=1"}
Process finished with exit code 0

GoDoc描述

String values encode as JSON strings coerced to valid UTF-8,

replacing invalid bytes with the Unicode replacement rune.

The angle brackets “<” and “>” are escaped to “\u003c” and “\u003e”

to keep some browsers from misinterpreting JSON output as HTML.

Ampersand “&” is also escaped to “\u0026” for the same reason.

This escaping can be disabled using an Encoder that had SetEscapeHTML(false) alled on it.

json.Marshal 默认 escapeHtml 为true,会转义 <、>、&

func Marshal(v interface{}) ([]byte, error) {
  e := &encodeState{}
  err := e.marshal(v, encOpts{escapeHTML: true})
  if err != nil {
    return nil, err
  }
  return e.Bytes(), nil
}

解决方案

方法一:

content = strings.Replace(content, "\\u003c", "<", -1)
content = strings.Replace(content, "\\u003e", ">", -1)
content = strings.Replace(content, "\\u0026", "&", -1)

这种方式比较直接,硬性字符串替换。比较憨厚

方法二:

文档中写到This escaping can be disabled using an Encoder that had SetEscapeHTML(false) alled on it.

我们先创建一个buffer用于存储json

创建一个jsonencoder

设置html编码为false

type Test struct {
  Content   string
}
func main() {
  t := new(Test)
  t.Content = "http://www.baidu.com?id=123&test=1"
  bf := bytes.NewBuffer([]byte{})
  jsonEncoder := json.NewEncoder(bf)
  jsonEncoder.SetEscapeHTML(false)
  jsonEncoder.Encode(t)
  fmt.Println(bf.String())
}
{"Content":"http://www.baidu.com?id=123&test=1"}
Process finished with exit code 0

查看文档和源码还是解决问题的好方法。

以上这篇golang json.Marshal 特殊html字符被转义的解决方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Go 文件读取和写入操作全面讲解

    Go 文件读取和写入操作全面讲解

    这篇文章主要为大家介绍了Go文件的读取和写入操作示例的全面详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-11-11
  • Go中过滤范型集合性能示例详解

    Go中过滤范型集合性能示例详解

    这篇文章主要为大家介绍了Go中过滤范型集合性能示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • GO中GORM 使用教程

    GO中GORM 使用教程

    GORM是Go语言的ORM库,它将关系型数据库表与Go语言结构体映射,提供便捷的数据库操作,本文就来介绍有下GO中GORM 使用教程,具有一定的参考价值,感兴趣的可以了解一下
    2025-02-02
  • Golang中println和fmt.Println区别解析

    Golang中println和fmt.Println区别解析

    Golang 中打印数据通常使用 fmt.Println() 方法,也可以使用内置的 println() 方法。这两个方法大家可能都使用过,它们的区别是什么呢?本文给大家详细讲解,感兴趣的朋友跟随小编一起看看吧
    2023-03-03
  • golang中defer的基本使用教程

    golang中defer的基本使用教程

    go语言中defer可以完成延迟功能,当前函数执行完成后再执行defer的代码块,下面这篇文章主要给大家介绍了关于golang中defer基本使用的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • Go模板后端渲染时vue单页面冲突

    Go模板后端渲染时vue单页面冲突

    go后端模版语法是通过 {{}} ,vue也是通过双花括号来渲染的,如果使用go渲染vue的html页面的时候就会报错,本文主要介绍了Go模板后端渲染时vue单页面冲突,感兴趣的可以了解一下
    2024-01-01
  • GO 语言学习指南

    GO 语言学习指南

    这篇文章主要介绍了GO 语言学习指南,介绍的相当全面,有需要的小伙伴参考下吧。
    2015-01-01
  • Go语言中TCP/IP网络编程的深入讲解

    Go语言中TCP/IP网络编程的深入讲解

    这篇文章主要给大家介绍了关于Go语言中TCP/IP网络编程的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-05-05
  • Go应用中优雅处理Error的技巧总结

    Go应用中优雅处理Error的技巧总结

    在程序员中,尤其是go新手,经常听到的一个讨论话题是:如何处理错误,这篇文章主要给大家介绍了关于Go应用中优雅处理Error的一些相关技巧,需要的朋友可以参考下
    2021-09-09
  • 解析Golang中的GoPath和GoModule

    解析Golang中的GoPath和GoModule

    在Golang中,有两个概念非常容易弄错,第一个就是GoPath,第二个则是GoModule,很多初学者不清楚这两者之间的关系,也就难以清晰地了解项目的整体结构,今天通过本文给大家介绍下Golang中的GoPath和GoModule相关知识,感兴趣的朋友一起看看吧
    2022-02-02

最新评论