Golang中json和jsoniter的区别使用示例

 更新时间:2023年12月09日 11:03:32   作者:小小平不平凡  
这篇文章主要介绍了Golang中json和jsoniter的区别使用示例,本文给大家分享两种区别,结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧

区别1: jsoniter除了支持字节数组与结构体互转外,还支持字符串与结构体互转

jsoniter使用示例:

package main
import (
	"fmt"
	"time"
	jsoniter "github.com/json-iterator/go"
	"github.com/json-iterator/go/extra"
)
type Order struct {
	Id         int64             `json:"id"`
	OrderId    string            `json:"order_id"`
	Money      float64           `json:"money"`
	CreateTime time.Time         `json:"create_time"`
	Extend     map[string]string `json:"extend"`
}
func main() {
	order := Order{
		Id:         666,
		OrderId:    "12345678",
		Money:      99.99,
		CreateTime: time.Now(),
		Extend:     map[string]string{"name": "张三"},
	}
	// 使用1:直接转成字符串
	jsonStr, _ := jsoniter.MarshalToString(order)
	fmt.Println("jsonStr:", jsonStr)
	// 使用2:直接转成字节数组
	jsonByteArr, _ := jsoniter.Marshal(order)
	fmt.Println("jsonByteArr:", jsonByteArr)
	// 使用3:反序列化之字符串转结构体
	str := `{"id":666, "order_id":"12345678", "money": 99.99, "create_time":"2023-12-05T16:19:33.943989108+08:00", "extend":{"name":"张三"}}`
	var order2 Order
	err := jsoniter.UnmarshalFromString(str, &order2)
	if err != nil {
		fmt.Println("err2:", err)
	}
	fmt.Println("order2:", order2)
	// 使用4:反序列化之字节数组转结构体
	var order3 Order
	var jsonNew = jsoniter.ConfigCompatibleWithStandardLibrary
	// 自适应类型
	extra.RegisterFuzzyDecoders()
	err = jsonNew.Unmarshal([]byte(str), &order3)
	if err != nil {
		fmt.Println("err3:", err)
	}
	fmt.Println("order3:", order3)
}

输出结果:

jsonStr: {"id":666,"order_id":"12345678","money":99.99,"create_time":"2023-12-05T16:20:40.595914198+08:00","extend":{"name":"张三"}}
jsonByteArr: [123 34 105 100 34 58 54 54 54 44 34 111 114 100 101 114 95 105 100 34 58 34 49 50 51 52 53 54 55 56 34 44 34 109 111 110 101 121 34 58 57 57 46 57 57 44 34 99 114 101 97 116 101 95 116 105 109 101 34 58 34 50 48 50 51 45 49 50 45 48 53 84 49 54 58 50 48 58 52 48 46 53 57 53 57 49 52 49 57 56 43 48 56 58 48 48 34 44 34 101 120 116 101 110 100 34 58 123 34 110 97 109 101 34 58 34 229 188 160 228 184 137 34 125 125]
order2: {666 12345678 99.99 2023-12-05 16:19:33.943989108 +0800 CST map[name:张三]}
order3: {666 12345678 99.99 2023-12-05 16:19:33.943989108 +0800 CST map[name:张三]}

区别2: jsoniter能够处理类型不匹配情况

package main
import (
	"encoding/json"
	"fmt"
	"time"
	jsoniter "github.com/json-iterator/go"
	"github.com/json-iterator/go/extra"
)
type Order struct {
	Id         int64             `json:"id"`
	OrderId    string            `json:"order_id"`
	Money      float64           `json:"money"`
	CreateTime time.Time         `json:"create_time"`
	Extend     map[string]string `json:"extend"`
}
func main() {
	str := `{"id":666, "order_id":"12345678", "money": "99.99", "create_time":"2023-12-05T16:19:33.943989108+08:00", "extend":{"name":"张三"}}`
	var order Order
	err := json.Unmarshal([]byte(str), &order)
	if err != nil {
		fmt.Println("json的err:", err)
	}
	fmt.Println("json的解析结果order:", order)
	var order2 Order
	var jsonNew = jsoniter.ConfigCompatibleWithStandardLibrary
	// 自适应类型
	extra.RegisterFuzzyDecoders()
	err = jsonNew.Unmarshal([]byte(str), &order2)
	if err != nil {
		fmt.Println("jsoniter的err2:", err)
	}
	fmt.Println("jsoniter的解析结果order2:", order2)
}

输出结果:

json的err: json: cannot unmarshal string into Go struct field Order.money of type float64
json的解析结果order: {666 12345678 0 2023-12-05 16:19:33.943989108 +0800 CST map[name:张三]}
jsoniter的解析结果order2: {666 12345678 99.99 2023-12-05 16:19:33.943989108 +0800 CST map[name:张三]}

到此这篇关于Golang中json和jsoniter的区别的文章就介绍到这了,更多相关Golang json和jsoniter内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解简单高效的Go struct优化

    详解简单高效的Go struct优化

    这篇文章主要为大家介绍了简单高效的Go struct优化示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • Golang channle管道的基本使用及快速入门

    Golang channle管道的基本使用及快速入门

    管道是Go语言中实现并发的一种方式,它可以在多个goroutine之间进行通信和数据交换,本文主要介绍了Golang channle管道的基本使用及快速入门,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12
  • go语言读取json并下载高清妹子图片

    go语言读取json并下载高清妹子图片

    前面我们介绍了使用python下载高清妹子图,作为程序猿,我们当然不能只会一种语言,今天我们就来使用go语言来读取API来下载妹子图吧,有需要的宅男们可以参考下。
    2015-03-03
  • go mutex互斥锁使用Lock和Unlock方法占有释放资源

    go mutex互斥锁使用Lock和Unlock方法占有释放资源

    Go号称是为了高并发而生的,在高并发场景下,势必会涉及到对公共资源的竞争,当对应场景发生时,我们经常会使用 mutex 的 Lock() 和 Unlock() 方法来占有或释放资源,虽然调用简单,但 mutex 的内部却涉及挺多的,本文来好好研究一下
    2023-09-09
  • Go与C语言的互操作实现

    Go与C语言的互操作实现

    在Go与C语言互操作方面,Go更是提供了强大的支持。尤其是在Go中使用C,你甚至可以直接在Go源文件中编写C代码,本文就详细的介绍一下如何使用,感兴趣的可以了解一下
    2021-12-12
  • Golang标准库binary详解

    Golang标准库binary详解

    这篇文章主要介绍了Golang标准库binary的相关资料,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • 一文详解Golang中的基础语法

    一文详解Golang中的基础语法

    这篇文章主要为大家详细介绍了Golang中基础语法的相关知识,文中的示例代码讲解详细,对我们学习Golang有一定的帮助,感兴趣的可以了解一下
    2023-03-03
  • 一文带你掌握GoLang中的指针

    一文带你掌握GoLang中的指针

    针是 Go 编程语言的重要组成部分,它们提供了一种直接引用和操作内存中数据的方法,在这篇文章中,我们将探讨一些技巧和技巧,以掌握 GoLang 中的指针并编写高效的代码,需要的可以参考一下
    2023-05-05
  • 一文详解Golang的模块版本管理与语义版本控制

    一文详解Golang的模块版本管理与语义版本控制

    在Golang中,模块(module)是Go 1.11版本引入的依赖管理系统,帮助开发者管理项目的依赖,在Go模块推出之前,开发者通常使用GOPATH和vendor目录来管理项目的依赖,本文将给大家详细介绍Golang的模块版本管理与语义版本控制,需要的朋友可以参考下
    2023-12-12
  • Go REFLECT Library反射类型详解

    Go REFLECT Library反射类型详解

    这篇文章主要为大家介绍了Go REFLECT Library反射类型详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08

最新评论