解决Golang json序列化字符串时多了\的情况

我们在对外提供API接口,返回响应的时候,很多时候需要使用如下的数据结构

type Response struct {
 Code int   `json:"code"`
 Msg string  `json:"msg"`
 Data interface{} `json:"data"`
}

该API接口返回一个状体码,状态信息,以及具体的值。但是具体的值可能根据各个接口的不同而不同。

在实际的开发过程中我们可能会得到一个实际的数据值,并将这个值赋值给data,然后json序列化返回给调用方。

这时如果你得到的data是一个经过json序列化之后的字符串,类似于{"Name":"happy"},然后再将这个字符串赋值给data,此时将response序列化得到的string,如下

{“code”:1,”msg”:”success”,”data”:”{\”Name\”:\”Happy\”}”}

我们会发现之前已经序列化好的字符串,每一个都多了\,这是因为转义引起的问题。

解决方法

直接将未序列化的data赋值给data

package main
import (
 "encoding/json"
 "fmt"
)
type Response struct {
 Code int   `json:"code"`
 Msg string  `json:"msg"`
 Data interface{} `json:"data"`
}
type People struct {
 Name string
}
func main() {
 data := People{Name: "happy"}
 response := &Response{
  Code: 1,
  Msg: "success",
  Data: data,
 }
 b, err := json.Marshal(&response)
 if err != nil {
  fmt.Println("err", err)
 }
 fmt.Println(string(b))
}

使用json 的RawMessage 将转义后的string,赋值给data

package main
import (
 "encoding/json"
 "fmt"
)
type Response struct {
 Code int   `json:"code"`
 Msg string  `json:"msg"`
 Data interface{} `json:"data"`
}
type People struct {
 Name string
}
func main() {
 data := `{"Name":"Happy"}`
 response := &Response{
  Code: 1,
  Msg: "success",
  Data: json.RawMessage(data),
 }
 b, err := json.Marshal(&response)
 if err != nil {
  fmt.Println("err", err)
 }
 fmt.Println(string(b))
}

通过使用json的json.RawMessage(data)函数将其转换一下,这样也能保证不存在转义符。

补充:golang string转json的一些坑

先带来点冷知识,不知道大家知不知道,反正我刚知道...

大佬们都知道怎么在string中给string类型赋值带双引号的字符串,没错就是用反斜杠,如下:

msg := "{\"name\":\"zhangsan\", \"age\":18, \"id\":122463, \"sid\":122464}"

但是golang还支持另外一个符号,我初学时候以为是单引号,但其实不是,是esc键下边那个,那么赋值带双引号的字符串就如下就行了:

ret := `{"access_token":"uAUS6o5g-9rFWjYt39LYa7TKqiMVsIfCGPEN4IZzdAk5-T-ryVhL7xb8kYciuU_m","expires_in":7200}`

进入正题

先看一段代码,起作用是把字符串转换为结构体对应的json

type people struct {
 name string `json:"name"`
 age int `json:"age"`
 id int `json:"id"`
}
type student struct {
 people
 id int `json:"sid"`
}
func main() {
 msg := "{\"name\":\"zhangsan\", \"age\":18, \"id\":122463, \"sid\":122464}"
 var someOne student
 if err := json.Unmarshal([]byte(msg), &someOne); err == nil {
 fmt.Println(someOne)
 fmt.Println(someOne.people)
 } else {
 fmt.Println(err)
 }
}

仔细看看,有没有错?我只能说,这样是输出不出来答案的,赋值错误,看下面的运行结果:

伤脑筋啊,我仔细看了半天,发现在定义的people和student两个结构体下边有绿色的波浪线(我用的vscode),像下边这样:

鼠标放上去显示的是:

大家都知道,golang中变量声明成大写和小写能引用的范围是不一样的,那我就想了,大小写问题???一脸懵逼把变量名首字母改成了大写,然后...就行了,代码变成了下边这样:

type people struct {
 Name string `json:"name"`
 Age int `json:"age"`
 ID int `json:"id"`
}
type student struct {
 people
 ID int `json:"sid"`
}
func main() {
 msg := "{\"name\":\"zhangsan\", \"age\":18, \"id\":122463, \"sid\":122464}"
 var someOne student
 if err := json.Unmarshal([]byte(msg), &someOne); err == nil {
 fmt.Println(someOne)
 fmt.Println(someOne.people)
 } else {
 fmt.Println(err)
 }
}

输出的结果这样:

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • 解决golang json解析出现值为空的问题

    我是通过beego框架,将请求过来的json进行解析,并将值保存在结构体中 --------------------1--------------------- request := UpdateCommentRequestData{} req := common.Request{Data: request} err := json.Unmarshal(controller.Ctx.Input.RequestBody, &req) --------------------------------

  • golang 实现struct、json、map互相转化

    一.Json和struct互换 (1)Json转struct例子: package main import ( "fmt" "encoding/json" ) type People struct { Name string `json:"name_title"` Age int `json:"age_size"` } func JsonToStructDemo(){ jsonStr := ` { "name_tit

  • golang xorm及time.Time自定义解决json日期格式的问题

    golang默认的time.Time类型在转为json格式时不是常用的2019-05-08 10:00:01这种格式,解决办法是自定义一个时间类型,例如 type myTime time.Time ,然后针对myTime实现Marshaler接口的MarshalJSON方法,例如: package models import ( "database/sql/driver" "time" ) const localDateTimeFormat string = &qu

  • golang使用json格式实现增删查改的实现示例

    需求和思路 在一般的小项目或者一个小软件,例如客户端之类的小程序中,可能会需要数据的持久化.但是使用一般的数据库(Mysql)之类的不合适.使用sqlite3这种嵌入式的是个较好的方法,但是Go语言中sqlite3的库是C语言的,Cgo不支持跨平台编译.正是由于这种需求,才想到使用json格式将数据直接保存在文件中. 具体的思路是怎么样呢? 在Go语言中如果要将数据转化成json格式的话,有两种格式 struct 和 map. 如果同时需要增删查改功能的话,将map作为中间格式是比较合适的.接下

  • Golang 如何解析和生成json

    JSON(Javascript Object Notation)是一种轻量级的数据交换语言,以文字为基础,具有自我描述性且易于让人阅读.尽管JSON是JavaScript的一个子集,但JSON是独立于语言的文本格式,并且采用了类似于C语言家族的一些习惯.JSON与XML最大的不同在于XML是一个完整的标记语言,而JSON不是.JSON由于比XML更小.更快,更易解析,以及浏览器的內建快速解析支持,使得其更适用于网络数据传输领域. Golang自带的JSON解析库encoding/json,可以用

  • 解决Golang json序列化字符串时多了\的情况

    我们在对外提供API接口,返回响应的时候,很多时候需要使用如下的数据结构 type Response struct { Code int `json:"code"` Msg string `json:"msg"` Data interface{} `json:"data"` } 该API接口返回一个状体码,状态信息,以及具体的值.但是具体的值可能根据各个接口的不同而不同. 在实际的开发过程中我们可能会得到一个实际的数据值,并将这个值赋值给data

  • 当自定义数据属性为json格式字符串时jQuery的data api问题探讨

    jQuery 的 data API 实现方式有缓存数据的效果 使用 IE 7 (IE8+ 在控制台切换至IE7 模式),当DOM 节点有自定义数据属性时,检查 DOM 节点即可看到 形如 jQuery18305664906559272507 的属性,这便是 用于从数据存储对象中获取自定义数据的建. 当自定义数据属性是一个 json 格式字符串时,缓存的数据如果被修改, 则修改后的数据继续存在于缓存系统中, 如果不留意,这可能导致一些BUG 复制代码 代码如下: <!DOCTYPE HTML>

  • MySQL解决Navicat设置默认字符串时的报错问题

    目录 简介 问题复现 原因分析 解决方案 简介 说明 本文介绍用Navicat添加字段(字符串类型)并设置默认值时的报错问题. 问题描述 在Java开发过程中,经常会遇到给已有的表添加字段的场景. 在插入新字段的时候,表里边可能已经有很多数据了,这时我们最好给新插入的字段设置一个默认值,这样MySQL就会将已经存在的数据的新加字段设置为默认值.设置默认值可以增加系统的可维护性. 但我在给已有的表插入新字段(字符串类型)的时候发现报错了,本文介绍如何解决这个问题. 报错信息 1064 - You

  • 解决Golang在Web开发时前端莫名出现的空白换行

    问题: 在使用Golang做Web开发时,有时候渲染出来的模板在前台显示时会出现一些奇怪的空白换行,具体特征就是查看css样式表并没有相关定义的空白部分. 分析: 查看出现问题页面的网页源代码,复制空白换行部分转码为Unicode编码,发现其中包含了\u2028这样的字符[图一].  [图一] 另外,直接在浏览器检查里边的html选择Edit as html,也可发现在空白处存在小红点,鼠标移上会直接显示该字符是\u2028[图二].查阅资料发现,这样的换行符在JavaScript中并不支持.

  • 使用jpa的实体对象转json符串时懒加载的问题及解决

    目录 解决转json符串时懒加载问题方法(1) 解决转json符串时懒加载问题方法(2) Rest风格中关于JPA使用懒加载的坑 解决转json符串时懒加载问题方法(1) 1.导入hibernate5转json的Maven依赖: <dependency>     <groupId>com.fasterxml.jackson.datatype</groupId>     <artifactId>jackson-datatype-hibernate5</a

  • 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

  • golang如何自定义json序列化应用详解

    前言 Go语言作为一个由Google开发,号称互联网的C语言的语言,自然也对JSON格式支持很好.下面这篇文章主要介绍了关于golang自定义json序列化应用的相关内容,下面话不多说了,来一起看看详细的介绍吧 问题引入 当某个struct存在某个字段为string或者[]byte类型但是实际上保存的内容是json格式的数据时,对其进行json序列化,比如 type Message struct { From string `json:"from"` To string `json:&

  • 详解如何解决使用JSON.stringify时遇到的循环引用问题

    程序员在日常做TypeScript/JavaScript开发时,经常需要将复杂的JavaScript对象通过JSON.stringify序列化成json字符串,保存到本地以便后续具体分析. 然而如果JavaScript对象本身包含循环引用,则JSON.stringify不能正常工作,错误消息: VM415:1 Uncaught TypeError: Converting circular structure to JSON 解决方案,使用下面这段来自这个网站的代码,定义一个全局cache数组,每

  • JSON序列化导致Long类型被搞成Integer的坑及解决

    目录 JSON序列化导致Long类型被搞成Integer的坑 上代码 方案 思考 JSON格式转int/long报错 Gson转换导致int转换成double的问题 JSON序列化导致Long类型被搞成Integer的坑 最近遇到一个错误,就是某个字段肯定是Long类型的,通过Map<String,Object>方式转成JSON字符串,然后存到了DB的某个字段里. 为了Json存储字,然后反序列化为Map(不是自定义的常规对象) 比如某二方为了提供通用的接口能力,将Map<String,

随机推荐