Go 语言 JSON 过滤器,让结构体中的数据字段按需使用

大家好,又见面了,我是 GitHub 精选君!

今天要给大家推荐一个 GitHub 开源项目 liu-cn/json-filter,该项目在 GitHub 有超过 100 Star,用一句话介绍该项目就是:Golang 的 JSON 字段过滤器,随意选择你想要输出为 JSON 的结构体字段,让 Go 拥有动态语言般的 JSON 处理能力。

json-filter 是一个用于过滤、查询和操作 JSON 数据的库。该库提供了一种类似于 SQL 的语法来查询 JSON 数据,可以帮助开发人员轻松地提取和操作 JSON 数据。它提供了一组简单易用的函数,可以帮助开发人员在 JSON 数据中进行筛选和选择。

在实际编程开发过程中,往往一个结构体会被多个使用场景引用,但是不同场景暴露的数据字段又不太一样,为了不重复定义多个数据结构增加维护成本,同时又不想在不同场景暴露出其他不需要的字段,那有什么好办法吗?如果你也有以上问题,或许可以尝试用 json-filter 的过滤器来过滤你想要的字段吧, 不仅简单,更重要的是很强大,很复杂的结构体也可以过滤出你想要的字段。

以下是该项目 Star 趋势图(代表项目的活跃程度):

如何安装使用

json-filter 作为一个 Go 语言开发的库,可以通过 go get 命令安装。

在命令行中输入以下命令,即可安装 json-filter 库:

go get -u github.com/liu-cn/json-filter

这样就可以在你的项目中引用 json-filter 库了。在代码中导入:

import "github.com/liu-cn/json-filter"

接下来可以使用 json-filter 库中提供的函数和方法来处理 JSON 数据。

使用示例 DEMO

这是一个使用 json-filter 库来过滤 JSON 数据的示例代码:

package main

import (
	"encoding/json"
	"fmt"
	"time"

	"github.com/liu-cn/json-filter/filter"
)

//同一个结构体,你可能想要在article 接口下只返回UID Avatar Nickname这三个字段就够了,其他字段不想要暴露
//另外你还想在profile 接口下返回 Nickname Sex VipEndTime Price 这四个字段,其他字段不想暴露
//这样的情况有很多,想要复用一个结构体来随心所欲的构造自己想要的json数据结构,可以看一个简单的demo

type User struct {
	UID    uint   `json:"uid,select(article)"`    //select中表示选中的场景(该字段将会使用到的场景)
	Avatar string `json:"avatar,select(article)"` //和上面一样此字段在article接口时才会解析该字段

	Nickname string `json:"nickname,select(article|profile)"` //"|"表示有多个场景都需要这个字段 article接口需要 profile接口也需要

	Sex        int       `json:"sex,select(profile)"`          //该字段是仅仅profile才使用
	VipEndTime time.Time `json:"vip_end_time,select(profile)"` //同上
	Price      string    `json:"price,select(profile)"`        //同上
}

func main() {

	user := User{
		UID:        1,
		Nickname:   "boyan",
		Avatar:     "avatar",
		Sex:        1,
		VipEndTime: time.Now().Add(time.Hour * 24 * 365),
		Price:      "999.9",
	}

	marshal, err := json.Marshal(user)
	if err != nil {
		panic(err)
	}
	fmt.Println(string(marshal)) //以下是官方的json解析输出结果:可以看到所有的字段都被解析了出来
	//{"uid":1,"nickname":"boyan","avatar":"avatar","sex":1,"vip_end_time":"2023-03-06T23:11:22.622693+08:00","price":"999.9"}

	//用法:filter.Select("select里的一个场景",这里可以是slice/array/struct/pointer/map)
	article:=filter.Select("article", user)
	articleBytes, _ := json.Marshal(article)
	fmt.Println(string(articleBytes)) //以下是通过json-filter 过滤后的json,此输出是article接口下的json
	//{"avatar":"avatar","nickname":"boyan","uid":1}
	
  //filter.Select fmt打印的时候会自动打印过滤后的json字符串
	fmt.Println(filter.Select("article", user)) //以下是通过json-filter 过滤后的json,此输出是article接口下的json
	//{"avatar":"avatar","nickname":"boyan","uid":1}

	fmt.Println(filter.Select("profile", user)) //profile接口下
	//{"nickname":"boyan","price":"999.9","sex":1,"vip_end_time":"2023-03-06T23:31:28.636529+08:00"}
}

更多项目详情请查看如下链接。

开源项目地址:https://github.com/liu-cn/json-filter

开源项目作者:liu-cn

以下是参与项目建设的所有成员:

关注我们,一起探索有意思的开源项目。


更多精彩请扫码关注如下公众号。

Written on January 29, 2023