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语言基础结构体用法及示例详解

    Go语言基础结构体用法及示例详解

    这篇文章主要为大家介绍了Go语言基础结构体的用法及示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2021-11-11
  • Golang HTTP服务超时控制实现原理分析

    Golang HTTP服务超时控制实现原理分析

    这篇文章主要介绍了Golang HTTP服务超时控制实现原理,HTTP服务的超时控制是保障服务高可用性的重要措施之一,由于HTTP服务可能会遇到网络延迟,资源瓶颈等问题,因此需要对请求进行超时控制,以避免服务雪崩等问题,需要的朋友可以参考下
    2023-05-05
  • go gin+token(JWT)验证实现登陆验证

    go gin+token(JWT)验证实现登陆验证

    本文主要介绍了go gin+token(JWT)验证实现登陆验证,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • Golang实现超时机制读取文件的方法示例

    Golang实现超时机制读取文件的方法示例

    读写文件是Go程序的基本任务,包括使用程序查看文件内容、创建或修改文件,Go提供了os,ioutil,io以及bufio包实现文件操作,本文介绍如果在读文件过程中增加超时机制,避免文件太大一直占用资源,需要的朋友可以参考下
    2025-01-01
  • Go语言利用Unmarshal解析json字符串的实现

    Go语言利用Unmarshal解析json字符串的实现

    本文主要介绍了Go语言利用Unmarshal解析json字符串的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • Go语言中的if条件语句使用详解

    Go语言中的if条件语句使用详解

    这篇文章主要介绍了Go语言中的if条件语句的使用,包括if...else语句以及相关嵌套,需要的朋友可以参考下
    2015-10-10
  • golang连接kafka的示例代码

    golang连接kafka的示例代码

    本文主要介绍了golang连接kafka的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • Go语言调用其它程序并获得程序输出的方法

    Go语言调用其它程序并获得程序输出的方法

    这篇文章主要介绍了Go语言调用其它程序并获得程序输出的方法,实例分析了Go调用cmd程序的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-02-02
  • Golang关键字select的常用用法总结

    Golang关键字select的常用用法总结

    这篇文章主要为大家详细介绍了golang中select关键字的常用用法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-10-10
  • 详解golang defer 闭包 匿名函数

    详解golang defer 闭包 匿名函数

    这篇文章主要介绍了golang defer 闭包 匿名函数的相关知识,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07

最新评论