使用go语言高效解析json详解(含多个json库的对比)

在 Go 语言中,解析 JSON 性能的优劣取决于所使用的库。以下是对比 encoding/json、jsoniter、go-json 和 gjson 的性能分析和推荐:

1. encoding/json(标准库)

简介

        encoding/json 是 Go 语言的标准库,易用性高且内置于 Go 语言中。然而,由于依赖于反射机制,它在高并发和大数据处理时性能较低。对于基本的应用场景,encoding/json 完全够用,但在追求高性能的应用中可能成为瓶颈。

示例

import ("encoding/json""fmt"
)type User struct {Name string `json:"name"`Age  int    `json:"age"`
}func main() {jsonString := `{"name":"Alice","age":30}`var user Usererr := json.Unmarshal([]byte(jsonString), &user)if err != nil {fmt.Println(err)}fmt.Println(user)
}

2. jsoniter

简介

        jsoniter 是一个高性能的 JSON 解析库,自称比标准库快三倍。它通过优化反射和内存分配机制,提高了解析速度。在大多数基准测试中,jsoniter 显示出比 encoding/json 更好的性能,特别是在处理大数据量和复杂 JSON 结构时。

安装

go get -u github.com/json-iterator/go 

 示例 

import ("fmt"jsoniter "github.com/json-iterator/go"
)type User struct {Name string `json:"name"`Age  int    `json:"age"`
}func main() {var json = jsoniter.ConfigCompatibleWithStandardLibraryjsonString := `{"name":"Alice","age":30}`var user Usererr := json.Unmarshal([]byte(jsonString), &user)if err != nil {fmt.Println(err)}fmt.Println(user)
}

3. go-json

简介

        go-json 也以其高性能著称,特别是在内存分配和速度方面表现优异。与 jsoniter 类似,go-json 旨在提高解析和编码的效率,常常被认为比 jsoniter 还要快一些,特别是在特定场景下的性能优化更为显著。

安装

go get -u github.com/goccy/go-json

示例

import ("fmt"json "github.com/goccy/go-json"
)type User struct {Name string `json:"name"`Age  int    `json:"age"`
}func main() {jsonString := `{"name":"Alice","age":30}`var user Usererr := json.Unmarshal([]byte(jsonString), &user)if err != nil {fmt.Println(err)}fmt.Println(user)
}

4. gjson

简介

        gjson 专注于从 JSON 字符串中快速获取值,而无需进行复杂的结构体定义或反序列化。它在读取特定字段时表现出极高的效率,但不适合需要完整解析和反序列化的场景。对于简单的 JSON 提取操作,gjson 非常方便且快速。

安装

go get -u github.com/tidwall/gjson 

示例 

import ("fmt""github.com/tidwall/gjson"
)func main() {jsonString := `{"name":"Alice","age":30}`// 使用 gjson 获取 name 字段name := gjson.Get(jsonString, "name").String()age := gjson.Get(jsonString, "age").Int()fmt.Printf("Name: %s, Age: %d\n", name, age)
}

5.GF框架中的gjson 

GF简介

    GF 框架,全称为 GoFrame,是一个面向现代 Web 和服务器应用程序开发的高性能 Go 语言开发框架。它旨在提供简洁、优雅、高效的开发体验,帮助开发者快速构建复杂的 Web 应用和微服务。

使用了GF框架的著名项目 

OpenSCRM: 基于 Go 和 React 的企业微信私域流量管理系统,适用于管理企业微信和私域流量的解决方案。它提供了高质量的代码和丰富的功能。
        BIFrost: 面向生产环境的 MySQL 和 MariaDB 数据同步工具,可以将数据同步到 Redis、MongoDB、ClickHouse 等多种服务。
        IOTFast: 基于 GoFrame 和 vue-next-admin 的物联网平台,适用于各种 IoT 设备的管理和数据处理。
        Focus: 一个社区系统项目,使用 GoFrame 作为后端框架,前端采用 jQuery 和 Bootstrap,数据库使用 MySQL。
        gf2-demo: 一个用于快速开发后端服务的脚手架项目,旨在帮助开发者专注于业务逻辑编写,并快速交付项目。 

GF 框架的主要特性

1).模块化设计:GF 提供了高度模块化的设计,可以根据需要引入不同的功能模块,降低代码耦合度,提高代码复用性。


2).高性能:GF 对性能进行了深度优化,支持高并发和高负载的应用场景,适合构建大规模的互联网服务。


3).丰富的工具库:GF 提供了丰富的工具库,包括配置管理、日志记录、数据库操作、缓存管理等,极大简化了开发工作。


4).RESTful 支持:内置对 RESTful API 的友好支持,方便开发现代 Web 服务。


5).自动化任务:支持定时任务、延时任务等自动化任务管理。


6).简洁的路由管理:提供灵活、简洁的路由管理功能,支持各种路由方式,包括静态路由、动态路由、中间件等。


7).完善的文档:GF 提供了详细的开发文档和丰富的示例代码,帮助开发者快速上手。

简介 


gf 框架中的 JSON 解析库,提供了丰富的功能和良好的性能,特别是在 GF 框架内使用时,能提供较好的集成体验,性能也很出色。

安装

go get -u github.com/gogf/gf/v2/encoding/gjson 

示例

import ("fmt""github.com/gogf/gf/v2/encoding/gjson"
)func main() {jsonData := `{"name": "Alice", "age": 30, "address": {"city": "Wonderland", "zip": "12345"}}`j, err := gjson.LoadContent(jsonData)if err != nil {fmt.Println("Failed to parse JSON:", err)return}name := j.GetString("name")city := j.GetString("address.city")fmt.Println("Name:", name)fmt.Println("City:", city)
}

性能对比

1.标准库 encoding/json:适合常规使用,易用性高,但性能在高负载情况下较低。


2.jsoniter:性能显著优于标准库,适合需要处理大量 JSON 数据的应用。


3.go-json:在性能上可能优于 jsoniter,特别是在内存分配优化上有独特优势。


4.gjson:最适合快速提取 JSON 字段,不适合完整的 JSON 解析和反序列化。


总结 

对于最好的性能表现,go-json 和 jsoniter 是优先选择。tidwall/gjson 在需要快速提取特定字段时性能最佳。如果使用 GF 框架,github.com/gogf/gf/v2/encoding/gjson 也是一个很好的选择,能够在提供高性能的同时保证良好的集成体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/32504.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java开发笔记Ⅱ(Jsoup爬虫)

Jsoup 爬虫 Java 也能写爬虫!!! Jsoup重要对象如下: Document:文档对象,每个html页面都是一个Document对象 Element:元素对象,一个Document对象里有多个Element对象 Node&#…

Android进程间通信 Messenger详解

//这里服务端Service是运行在单独的进程中的 android:process“:other” class MessengerService : Service() { private lateinit var mMessenger: Messenger override fun onBind(intent: Intent): IBinder { log(TAG, “onBind~”) //传入Handler实例化Messenger mMes…

Golang | Leetcode Golang题解之第174题地下城游戏

题目&#xff1a; 题解&#xff1a; func calculateMinimumHP(dungeon [][]int) int {n, m : len(dungeon), len(dungeon[0])dp : make([][]int, n 1)for i : 0; i < len(dp); i {dp[i] make([]int, m 1)for j : 0; j < len(dp[i]); j {dp[i][j] math.MaxInt32}}dp[…

mysql数据库切换成kingbase(人大金仓)数据库时遇到的字段不存在问题

一、问题描述 mysql数据库切换成国产数据库人大金仓&#xff08;kingbase&#xff09;数据库的遇到的字段不存在的问题,根本原因其实是没有找到相对应的表&#xff0c;报错示例如下图所示&#xff1a; 二、问题解决 1、如果所有的表都发生上述的错误&#xff0c;kingbase的…

初见SpringCloud ing

Consul 服务注册与发现 服务注册与发现 服务注册&#xff1a;微服务在启动时&#xff0c;会将自己的信息&#xff08;如 IP 地址、端口、服务名称等&#xff09;注册到 Consul。 服务发现&#xff1a;其他微服务可以通过 Consul 查询到已注册的服务&#xff0c;并通过这些信息…

算法训练(leetcode)第十五天 | 654. 最大二叉树、617. 合并二叉树、700. 二叉搜索树中的搜索、98. 验证二叉搜索树

刷题记录 654. 最大二叉树617. 合并二叉树700. 二叉搜索树中的搜索直接前序遍历借助BST性质 98. 验证二叉搜索树中规中矩版简洁版&#xff1a; 654. 最大二叉树 leetcode题目地址 本题和106. 从中序与后序遍历序列构造二叉树的思路类似&#xff0c;递归建树&#xff0c;每次找…

基于matlab的不同边缘检测算子的边缘检测

1 原理 1.1 边缘检测概述 边缘检测是图像处理和计算机视觉中的基本问题&#xff0c;其目的在于标识数字图像中亮度变化明显的点。这些变化通常反映了图像属性的重要事件和变化&#xff0c;如深度不连续、表面方向不连续、物质属性变化和场景照明变化等。边缘检测在特征提取中…

OSPF 2类LSA详解

概述 上图为2类LSA : Network LSA 的报文格式 , 我们重点关注3个报文字段即可 , 其他内容没有实际的信息 Link State ID : DR的接口IP地址 Network Mask : 该MA网络的掩码 Attached Router : 连接在该MA网络的所有路由器的Router ID 2类LSA一定是DR产生的 , 关于OSPF DR的细节…

数据结构之二叉树的超详细讲解(3)--(二叉树的遍历和操作)

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 数据结构之二叉树的超详细讲解(3)--(二叉树链式结构的实现) 收录于专栏【数据结构初阶】 本专栏旨在分享学习数据结构学习的一点学习笔记&#xff0c;欢迎大家在…

展讯-QMI8658和气压传感器驱动调试

1.调试QMI8658 参考demo&#xff0c;添加QMI8610相关内容 当前驱动路径位于&#xff1a;bsp/modules/input/misc/qmi8610/qmi8610.c 编译使用make sockoimage 用fastboot烧录 1.确定驱动被正常加载 代码添加之后&#xff0c;首先确定有没有进入当前驱动文件 dmesg |grep …

如何用GO语言实现冒泡排序算法?

本章教程,介绍一下如何用GO语言实现基础排序算法中的冒泡排序。 一、程序代码 package mainimport ("fmt""math/rand""time" )// bubbleSort 函数实现冒泡排序算法 func bubbleSort(arr []int) {n

32 - 判断三角形(高频 SQL 50 题基础版)

32 - 判断三角形 select *,if(xy>z and xz>y and zy > x,Yes,No) triangle fromTriangle;

Day9 —— 大数据技术之ZooKeeper

ZooKeeper快速入门系列 ZooKeeper的概述什么是ZooKeeper&#xff1f;ZooKeeper的特点和功能使用ZooKeeper的原因 ZooKeeper数据模型ZooKeeper安装ZooKeeper配置ZooKeeper命令行操作常见服务端命令 ZooKeeper的概述 什么是ZooKeeper&#xff1f; ZooKeeper是一个开源的分布式协…

jarvisoj_level2

首先检查checksec 可以看见no canary found 说明可能是栈溢出 运行一下程序 随便输一个,得到hello world(感觉这一步好像没啥用,没有RE那用) IDA 32 打开 后门 漏洞点 buf: 代码思路:利用溢出,把buf填满,然后构造程序,得到获取shell的目的 exp来自 BUUCTF—jarvisoj_level…

【Qt】学习Day1

文章目录 Qt简介创建第一个Qt程序创建过程介绍main函数工程文件头文件控件源文件快捷键按钮控件常用API对象树坐标系 信号和槽自定义信号自定义槽函数触发自定义的信号案例-下课后&#xff0c;老师触发饿了信号&#xff0c;学生响应信号&#xff0c;请客吃饭重载信号连接信号La…

containerd的客户端工具ctr命令

containerd的客户端工具ctr命令 类似docker为docker-shim容器运行时的客户端工具&#xff0c;ctr 是 containerd 的客户端工具&#xff0c;安装containerd作为容器运行时后&#xff0c;会自动安装ctr。 rootmaster1:~# ctr -v ctr github.com/containerd/containerd 1.7.121.…

Paxos分布式共识算法

Paxos分布式共识算法 一、简介 Paxos算法是由莱斯利兰伯特(Leslie Lamport)于1990年提出的一种基于消息传递且具有高度容错特性的一致性算法。它主要用于解决分布式系统中如何就某个值达成一致&#xff0c;并保证整个系统的一致性&#xff0c;即使在部分节点发生故障的情况下…

论文浅尝 | 基于生成模型的多模态实体链接

笔记整理&#xff1a;郭凌冰&#xff0c;浙江大学博士&#xff0c;研究方向为知识图谱 链接&#xff1a;https://arxiv.org/abs/2306.12725 1. 动机 多模态实体链接&#xff08;Multimodal Entity Linking&#xff0c;MEL&#xff09;旨在将带有多模态上下文的提及映射到知识库…

[SAP ABAP] 运算符

1.算数运算符 算术运算符描述加法-减法*乘法/除法MOD取余 示例1 输出结果: 输出结果: 2.比较运算符 比较运算符描述示例 等于 A B A EQ B <> 不等于 A <> B A NE B >大于 A > B A GT B <小于 A < B A LT B >大于或等于 A > B A GE B <小…

keep-alive实现页面缓存

<!--router-view 实现页面缓存--> <router-view v-slot"{Component}"><keep-alive :max"8"><component :is"Component"></component></keep-alive> </router-view>