博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一.go语言 struct json相互转换
阅读量:5049 次
发布时间:2019-06-12

本文共 2768 字,大约阅读时间需要 9 分钟。

1.Go语言自带JSON转换库  encoding/json

2.把对象转换为json的方法为 json.Marshal(),其函数原型为:

func Marshal(v interface{}) ([]byte, error) {   e := newEncodeState()   err := e.marshal(v, encOpts{escapeHTML: true})   if err != nil {      return nil, err   }   buf := append([]byte(nil), e.Bytes()...)   e.Reset()   encodeStatePool.Put(e)   return buf, nil}

1)   函数可以接收任意类型的数据 v,并转换为字节数组类型,返回值就是json数据和错误代码;若转换成功,则err = nil;

2)在进行对象转换为JSON的过程中,会遵循一下几条原则:
  1.布尔型转换为JSON后仍然是布尔型;
  2.浮点型转换为JSON后里面的常规数字;
  3.字符串将以UTF-8编码转化输出为Unicode字符串,将特殊字符转义;
  4.数组和切片被转换为JSON里面的数组,[]byte类会被转换为base64编码后的字符串,slice的零值被转换为null;
  5.结构体转换为JSON对象,并且只有结构体内变量必须首字母大写,才可被导出的字段转化输出,而且这些字段会被作为JSON对象的字符串索引;
  6.转换一个map类型的数据结构时,该数据的类型必须时map[string]T,T可以是encoding/json包支持的任意类型。
2.把JSON转换回对象方法的方法为json.Unmarshal(),函数原型为:

func Unmarshal(data []byte, v interface{}) error {   // Check for well-formedness.   // Avoids filling out half a data structure   // before discovering a JSON syntax error.   var d decodeState   err := checkValid(data, &d.scan)   if err != nil {      return err   }   d.init(data)   return d.unmarshal(v)}

 1)函数会把传入的data作为一个JSON来进行解析,解析后的数据存储在参数v中,这个参数可以是任意类型的参数(是一个类型的指针);

 2)json.Umarshal()函数会根据一个约定的顺序查找结构中的字段,如果找到一个即发生匹配。假设一个JSON对象有一个名为“Foo”的索引,要将“Foo”所对应的值填充到目标结构体的目标字段上,json.Umarshal()将会遵循如下顺序进行查找匹配:

  1.一个包含Foo标签的字段;

  2.一个名为Foo的字段

  3.一个名为Foo或者除了首字母不区分大小写的名为Foo的字段,这些字段在类型声明中必须都是首字母大写,可被导出字段。

  注意:如果JSON中的字段在Go目标类型中不存在,json,Umarshal()函数在解码过程中会丢弃该字段。

3)当JSON的结构位置时,会遵循一下规则:

  1.JSON中的布尔型将会转换为Go中的bool类型;

  2.数值将会被转换为Go的float64类型;

  3.字符串转换后是stirng类型;

  4.JSON数组将会转换为[]interface{}类型

  5.JSON对象会被转换为map[stirng]interface{}类型;

  6.null值会转换为nil

  注意:在Go的标准库中encoding/json包中,允许使用map[stirng]interface{}和interface{}类型来分别存储结构中的JSON对象和JSON数组。

4.遇到问题,解决问题

1)接收JSON字符串后,将其转换为结构体,JSON字符串中某一键值对,值类型为JSONArray,在结构体中声明为string。在转换之前将JSON中“properties”的值试图转换为string类型,使用json.Marshal(interface{})即可;也可在结构体中修改该变量类型为[]interface{},转换成功。

 

{	"subjectId":"MathOperation",	"subjectName":"数学运算",	"subjectDispSerial":2,	"subjectClass":"principal",	"activityId":"Sum",	"actDispSerial":1,	"icon":"Sum.png",	"modiTime":"2017-06-13 10:17:17",	"funcGrp":"arithmetic",	"author":"",	"status":2,	"properties":[		{"key":"nodeLabel","val":"","diapName":"节点标签","editStyle":"TextField","dispSerial":10,"editable":true},	]	}

  

type Activity struct {	Id int	SubjectId string	SubjectName string	SubjectDispSerial int	SubjectClass string	ActivityId string	ActivityName string	ActDispSerial int	Icon string	ModiTime string	FuncGrp string	Author string	Status int	Properties []interface{}}
var act models.Activityif err := json.Unmarshal([]byte(data), &act); err == nil {	fmt.Println(act.SubjectId)	fmt.Println(act.ActivityId)	fmt.Println(act.Properties)} else {	fmt.Println(err)}

  

  

  

转载于:https://www.cnblogs.com/li-jing/p/10133619.html

你可能感兴趣的文章
js 倒计时10s
查看>>
再次陷入迷惘期的一点感想
查看>>
字符串的常用方法
查看>>
SQL查询语句 常用示例
查看>>
抄写例题作业1
查看>>
Nginx geo模块
查看>>
mingw using pthread
查看>>
centos6.4搭建基于ftp的yum源让本地局域网服务器使用
查看>>
php GD 和图像处理函数, 制作一张图片
查看>>
设计模式第二篇-观察者模式
查看>>
把一元可以分解成几个1毛,2毛,5毛?
查看>>
windows系统安装gcc编译器----c/c++语言编译器
查看>>
12、Oracle中的dual数据表
查看>>
python网络编程-OSI七层模型详解
查看>>
scala 模式匹配详解 2 scala里是怎么实现的?
查看>>
音视频处理中的硬压缩与软压缩
查看>>
STL-map
查看>>
第三周进度条
查看>>
Keil的lib生成个人总结
查看>>
java程序员常见面试题
查看>>