一.go语言 struct json相互转换

   2023-02-09 学习力0
核心提示:1.Go语言自带JSON转换库  encoding/json2.把对象转换为json的方法为 json.Marshal(),其函数原型为:func Marshal(v interface{}) ([]byte, error) { e := newEncodeState() err := e.marshal(v, encOpts{escapeHTML: true}) if err != nil {return nil, err

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.Activity

if err := json.Unmarshal([]byte(data), &act); err == nil {
	fmt.Println(act.SubjectId)
	fmt.Println(act.ActivityId)
	fmt.Println(act.Properties)

} else {
	fmt.Println(err)
}

  

  

  

 
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • intellij idea go go go!
    安装如下:1. intellij idea2. jdk-8u31-windows-x643.1. scala:Scala是一门多范式的编程语言,一种类似java的编程语言[1]  ,设计初衷是实现可伸缩的语言[2]  、并集成面向对象编程和函数式编程的各种特性。 2.IdeaVimEmulates Vim editorVim是一个类似
    03-08
  • 用 VSCode 搭建 Go 语言开发环境
    用 VSCode 搭建 Go 语言开发环境
    介绍这是来自 Funai Research Institute Digital 的 osw。由于我决定使用 Go 语言进行工作,所以我会在学习时将其记录在备忘录中。如果您可以参考,我将不胜感激。目标听众从现在开始学习 Go 语言的人我正在考虑使用 VSCode本次使用的环境这次,我们将基于以
    03-08
  • Go语言使用goroutine及通道实现并发详解
    Go语言使用goroutine及通道实现并发详解
    目录使用通道接收数据阻塞接收数据非阻塞接收数据接收任意数据,忽略掉接收的数据循环接收数据使用通道接收数据在上一篇文章中介绍了通道以及使用通道发送数据,本篇接着了解通道的基本内容,如何使用通道接收数据;通道的接收同样使用"-"操作符;使用通道接
  • Go 数据结构之堆排序示例详解
    Go 数据结构之堆排序示例详解
    目录堆排序堆排序过程动画显示开始堆排序代码实现总结堆排序堆排序是一种树形选择排序算法。简单选择排序算法每次选择一个关键字最小的记录需要 O(n) 的时间,而堆排序选择一个关键字最小的记录需要 O(nlogn)的时间。堆可以看作一棵完全二叉树的顺序存储结构
  • Go语言数据结构之希尔排序示例详解 go语言堆排序
    Go语言数据结构之希尔排序示例详解 go语言堆排
    目录希尔排序算法思想图解算法Go 代码实现:总结希尔排序在插入排序中,在待排序序列的记录个数比较少,而且基本有序,则排序的效率较高。1959 年,Donald Shell 从“减少记录个数” 和 “基本有序” 两个方面对直接插入排序进行了改进,提出了希尔排序
  • 【每天自动更新】Go增强月-分享你的开发必备知识-LGTM排行榜!
    【每天自动更新】Go增强月-分享你的开发必备知
    这篇文章是“Go增强月——让我们分享你需要知道的发展知识——”本文支持主题。我们将使用 Qiita API v2 来收集似乎在参与“Go 增强月-让我们分享您需要了解的开发知识-”的文章。我将在收集的文章组(数据)上尝试这个和那个。按 LGTM 编号对文章进行排序投
  • Go REFLECT Library反射类型详解
    Go REFLECT Library反射类型详解
    目录一、反射概述二、反射类型对象基本数类型的 反射类型对象引用数据类型的 反射类型对象结构体的 反射类型对象指针的 反射类型对象一、反射概述反射是指程序在运行期间对程序本身进行访问和修改的能力。程序在编译过程中变量会被转换为内存地址,变量名不会
  • Go-ethereum 解析ethersjs中产生的签名信息思路详解
    Go-ethereum 解析ethersjs中产生的签名信息思
    目录Go-ethereum 解析ethersjs中产生的签名信息1. ethers 消息签名1.1 ethers 对签名消息进行解析2. Golang 签名解析3. 总结Go-ethereum 解析ethersjs中产生的签名信息在签名验证的过程中,我们判断签名正确的前提是,签名解析后的公钥,和发起这次动作的人是
  • go并发编程sync.Cond使用场景及实现原理
    目录使用场景实现原理copyCheckerWaitSignalBroadcast使用场景sync.Cond是go标准库提供的一个条件变量,用于控制一组goroutine在满足特定条件下被唤醒。sync.Cond常用于一组goroutine等待,一个goroutine通知(事件发生)的场景。如果只有一个goroutine等待,
  • go 熔断原理分析与源码解读
    go 熔断原理分析与源码解读
    目录正文熔断原理熔断器实现hystrixBreaker和googlebreaker对比源码解读结束语正文熔断机制(Circuit Breaker)指的是在股票市场的交易时间中,当价格的波动幅度达到某一个限定的目标(熔断点)时,对其暂停交易一段时间的机制。此机制如同保险丝在电流过大时
点击排行