Golang ---json解析

golang官方为我们提供了标准的json解析库–encoding/json,大部分情况下,使用它已经够用了。不过这个解析包有个很大的问题–性能。它不够快,如果我们开发高性能、高并发的网络服务就无法满足,这时就需要高性能的json解析库,目前性能比较高的有json-iteratoreasyjson

现在我们需要引进一个高性能的json解析库,这里以json-iterator为例,但是我们全部换掉又不放心,所以可以先小范围的测试下,这时候我们就需要两个解析库并存,那么这时候我们如何选择我们需要的解析库编译和运行呢?

解决上面问题的办法就是条件编译。Go语言为我们提供了基于tags的编译约束来解决这个问题。

统一JSON库

我们先举个例子看看结果。现在我们需要两个库并存,所以我们先得统一这两个库的用法(参考适配器模式),这里我们使用一个自定义的json包来适配encoding/jsonjson-iterator

json/json.go

// +build !jsoniter

package json

import (
	"encoding/json"
	"fmt"
)

func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) {
	fmt.Println("Use [encoding/json] package")
	return json.MarshalIndent(v,prefix,indent)
}

  

json/jsoniter.go

// +build jsoniter

package json

import (
	"fmt"
	"github.com/json-iterator/go"
)

var (
	json = jsoniter.ConfigCompatibleWithStandardLibrary
)

func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) {
	fmt.Println("Use [jsoniter] package")
	return json.MarshalIndent(v,prefix,indent)
}

  

目录结构如下:

json
├── json.go
└── jsoniter.go

例子中以MarshalIndent函数为例,我们发现json包下的两个go文件中都有MarshalIndent函数的定义,并且签名一致,但是它们又是使用不同的json解析库实现,这就是我们统一适配包装后的结果,调用统一了。

Demo演示

为了区分调用的是哪个json库的具体实现,打印日志,以便区分。现在我们使用json.MarshalIndent测试一下。

package main

import (
	"fmt"
	"json"
)

func main() {
	u := user{"Mike", 30}
	b, err := json.MarshalIndent(u, "", "  ")

	if err != nil {
		fmt.Println(err)
	} else {
		fmt.Println(string(b))
	}

}

type user struct {
	Name string
	Age  int
}

 使用很简单,把一个user结构体对象转为json字符串,并打印出来。我们运行go run main.go看看结果。

Use [encoding/json] package

{

"Name": "Mike",

"Age": 30

}

 保持我们默认使用encoding/json库的方式不变。现在我们换一种编译运行方式:

go run -tags=jsoniter main.go

  这次运行和上次不同的地方在于我们加了-tags=jsoniter,然后就使用了json-iterator这个json库,这就是选择性的条件编译,达到了我们小部分测试新的json库的目的。

 

条件编译

我们发现,条件编译的关键在于-tags=jsoniter,也就是-tags这个标志,这就是Go语言为我们提供的条件编译的方式之一。

好了,回过头来看我们刚开始时json/json.gojson/jsoniter.go这两个Go文件的顶部,都有一行注释:

// +build !jsoniter

// +build jsoniter

这两行是Go语言条件编译的关键。+build可以理解为条件编译tags的声明关键字,后面跟着tags的条件。

// +build !jsoniter表示,tags不是jsoniter的时候编译这个Go文件。 // +build jsoniter表示,tags是jsoniter的时候编译这个Go文件。

也就是说,这两种条件是互斥的,只有当tags=jsoniter的时候,才会使用json-iterator,其他情况使用encoding/json

小结

利用条件编译,我们实现了灵活选择json解析库的目的,且tags只是其中的一部分,Go语言还可以根据Go文件后缀进行条件编译。

原文地址:https://www.cnblogs.com/saryli/p/11407157.html

时间: 2024-11-06 10:05:37

Golang ---json解析的相关文章

golang json解析之大小写

package main import ( "encoding/json" "fmt" _ "time" ) type Header struct { FileName  string Host      string Offset    string Timestamp string } type JsonData struct { header string `json:"xx"` Body   string `json:

Golang中解析json,构造json

json解析是如今(网络)应用程序开发中最不可或缺的一环了.许多语言需要库支持才可以解析.构造json,但Golang凭借着原生库就可以很好地做到这一点. json的基本表现形式有两个:struct与string.解析与构造就是要解决string2struct与struct2string.在Golang里,负责这两项功能的库位于"encoding/json".库中函数使用说明可以前往“https://gowalker.org/encoding/json”查看.下面给出使用示例源码. J

golang 数据建模json解析

1.0 controller get请求 type MainController struct { beego.Controller } func (this *MainController) Get() { this.Data["IsHome"] = true this.Data["Website"] = "s.me" this.Data["Email"] = "[email protected]" th

golang json用法讲解

简介 json格式可以算我们日常最常用的序列化格式之一了,Go语言作为一个由Google开发,号称互联网的C语言的语言,自然也对JSON格式支持很好.但是Go语言是个强类型语言,对格式要求极其严格而JSON格式虽然也有类型,但是并不稳定,Go语言在解析来源为非强类型语言时比如PHP等序列化的JSON时,经常遇到一些问题诸如字段类型变化导致无法正常解析的情况,导致服务不稳定.所以本篇的主要目的 就是挖掘Golang解析json的绝大部分能力 比较优雅的解决解析json时存在的各种问题 深入一下Go

json解析 本地文件和网上文件(通过接口)

json解析 对本地文件解析 NSString *path =[[NSBundle mainBundle] pathForResource:@"movielist" ofType:@"txt"]; // 第二个参数,制定一个容器来接收解析后的数据 NSMutableDictionary *dic =[NSJSONSerialization JSONObjectWithData:data option:NSJSONReadingMutableContainers er

Android网络请求框架AsyncHttpClient实例详解(配合JSON解析调用接口)

最近做项目要求使用到网络,想来想去选择了AsyncHttpClient框架开进行APP开发.在这里把我工作期间遇到的问题以及对AsyncHttpClient的使用经验做出相应总结,希望能对您的学习有所帮助. 首先按照惯例先来简单了解一些AsyncHttpClient网络框架的一些知识. 1.简介 Android中网络请求一般使用Apache HTTP Client或者采用HttpURLConnect,但是直接使用这两个类库需要写大量的代码才能完成网络post和get请求,而使用android-a

Linux json解析jq

jq是一个linux下很方便的json解析器,平时看json文件都是一行混在一起的,非常不适合阅读. https://stedolan.github.io/jq/download/ 直接到官网上下载,然后像运行普通程序一样运行就可以了. 1.最常用的用法是 ./jq . filename 格式化输出filename 2.将格式化的json输出,反向转换变成一行.(什么,没什么卵用,呵呵,真正碰到需要用的时候愁死你) ./jq -c . filename 还有很多用法,直接上官方说明: https

Java基础知识强化103:JSON解析框架汇总

1.Gson Gson是Google提供的一个能够将Java对象转换成相应JSON表达形式的一个开源Java类库,当然用Gson也能将JSON字符串转换成与之等价的Java对象.Gson对于任何Java对象都有效,包括那些预先存在没有源代码的对象. 现在已经有一些能将Java对象转换成JSON的开源项目了.但是大多数项目都要求你在类文件中加入Java注解,而当你无法改动源代码的时候这是无法做到的.并且它们也不支持Java泛型.但是Gson却将这两点作为自己非常重要的设计目标. 目标 使用toJs

Android 之json解析2

JSON(JavaScript Object Notation) 定义:字符串 键值对 解析方法有JSON,谷歌GSON,阿里巴巴FastJSON 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性. 业内主流技术为其提供了完整的解决方案(有点类似于正则表达式,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换. JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为. Json建构于两种结构: 1.“名称/值”对的集合(A collection of name