Giter Club home page Giter Club logo

liu-cn / json-filter Goto Github PK

View Code? Open in Web Editor NEW
130.0 1.0 19.0 171 KB

golang json字段过滤,复用struct 随意选择你想要输出为json的结构体字段。 json filter Golang's JSON filter randomly selects the structure fields you want to output as JSON,Let go have dynamic language like json processing capability

Home Page: https://www.bilibili.com/video/BV1s14y1G72v/

License: MIT License

Go 100.00%
golang go json filter json-filter generic go-json json-marshal json-omit golang-json

json-filter's Introduction

json-filter's People

Contributors

h3110w0r1d-y avatar itryit avatar liu-cn avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

json-filter's Issues

您好楼主,请教一个问题

如题。其实很多时候为了方便,都把比如什么场景,返回什么字段,为灵活都配置到数据库,其实比如根据数据库配置到字段,动态映射到select 或者omit里面,这样更方便

是否能对字段进行脱敏?

现在好像只支持不返回字段,但是在某些场景下可能需要对json的部分自动进行脱敏返回,不知道有没有办法支持

Ptr Nil panic

Nil Ptr cause panic
指针未做nil判断会导致panic

file: filter/parser.go
line: 19 to 22

Test:

type T struct {
    A string `json:"a,select(test)"`
}

func TestNil(t *testing.T) {
    var a *T
    var el = map[string]any{
        "a": a, // a: nil ptr
    }

    fmt.Println(filter.Select("test", el))
}

uuid.UUID和[]byte类型被转成了json数组

问题

uuid.UUID和[]byte被转成了json数组

部分代码

使用Flamego + gorm框架开发

type BaseModel struct {
	ID        uint      `gorm:"primarykey" json:"id"`
	CreatedAt time.Time `json:"created_at"`
	UpdatedAt time.Time `json:"updated_at"`
	UUID      uuid.UUID `gorm:"uniqueIndex; type:char(36);" json:"uuid"`
}
// r is flamego.Render
// 非预期
r.JSON(200, map[string]interface{}{
	"status":  200,
	"message": "success",
	"data":    filter.Omit("status", user),
})
// 预期
r.JSON(200, map[string]interface{}{
	"status":  200,
	"message": "success",
	"data":    user,
})

非预期结果:

image

[]byte类型被转成了json数组

预期结果:

image

[]byte类型被自动编码成了Base64

其他信息:

flamego.Render中使用的是json.Encoder

// flamego.Render部分源码
func (r *render) JSON(status int, v interface{}) {
	r.responseWriter.Header().Set("Content-Type", "application/json; charset="+r.opts.Charset)
	r.responseWriter.WriteHeader(status)

	enc := json.NewEncoder(r.responseWriter)
	if r.opts.JSONIndent != "" {
		enc.SetIndent("", r.opts.JSONIndent)
	}

	err := enc.Encode(v)
	if err != nil {
		http.Error(r.responseWriter, err.Error(), http.StatusInternalServerError)
		return
	}
}

你好,作者,我对序列化这里有一个问题请教

我们知道GoLang中的Json库做序列化和反序列化之后,如果结构体字段为零值,使用‘omitempty’可以让该字段结果被忽视。“json-filter"提供的方法中,我尝试了一下,是不能做到的,想问一下,这个问题后续可以解决吗?

自定义类型失效

由于在go中时间的json编码与解码与我们的时间格式不习惯,通常我们会自定义time的UnmarshalJSON与MarshalJSON, 以下代码无法生效?请问如何解决

package main

import (
	"fmt"
	"time"

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

type LocalTime time.Time
type User struct {
	ID        int       `json:"id,select(list)"`
	BirthTime LocalTime `json:"birth_time,select(list)"`
}

func main() {
	user := User{
		ID:        111,
		BirthTime: LocalTime(time.Now()),
	}
	fmt.Println(filter.SelectMarshal("list", user).MustJSON())
}

以上代码,无法输出BirthTime属性

定义baseModel的时候不生效

你好,我非常喜欢你这个框架,我几乎找了好久都没找到这样的框架来处理我的困扰,作为有代码洁癖的我,深深爱上了这个。

但是我遇到一个场景貌似卡住了,不知道是不是我使用方式不对,我尝试了好几次都不生效,当我定义一个BaseModel的时候,在BaseModel里面的字段失效了,但是其他的都没问题。

image

最后希望作者可以继续维护下去,祝好~

编码算法

很多编码算法要求处理结构体,切片,数组,map等复合类型成员的开始和结束用于编解码。

比如protobuf v2版本的packet编码,需要得到结构体开始的id,类型,值,id可以用字段下标得到。

那么问题是目前所有反射库都没有这个功能,大师可以实现一波嘛?方便拓展到其它的编码算法,谢谢。

当提交内容是长度为0的切片时,会被转换成struct类型输出

当提交内容是长度为0的切片时,会被转换成struct类型输出

var testSlice = []int{}
j, _ := json.Marshal(filter.Select("t", testSlice))
fmt.Println(string(j))

期望输出:[]
实际输出:{}

检查后发现是filter/parser.go 311 附近代码导致未按照Slice规则处理空切片

l := valueOf.Len()
if l == 0 {
  t.Val = emptySlice
  // 此处 t.IsSlice == false
  return
}

性能优化方案

该issue主要讨论如何对过滤性能进行进一步提升,目前此项目是利用反射获取结构体的字段信息,把打标记的字段提取出来,挂载在一个n叉树的结构体上,在过滤时为了提高性能,利用了缓存,进行了3个版本的优化策略

最早版本 : 遍历整个结构体的所有字段,遍历到最深层,然后每遍历一个字段就获取一下字段的json tag 然后判断是否被选中,提取出需要用的

目前版本:缓存了所有结构体字段的tag信息,遍历每一个字段时即可知道该字段是否选中,不需要获取tag信息,不需要字符串处理,有了很大的性能提升,

目前优化的新版本:在调用过滤方法时,根据结构体的pkg path生成一个新的缓存n叉树,该数据结构仅仅存储该结构体在该缓存场景下的所有字段的index下标信息,在遍历结构体时根据下标跳过那些被过滤掉的字段,此时避免了大部分无用的反射,而且不需要进行字符串处理,性能又进行了很大幅度的提升(特别是在,select模式下一个10个字段的结构体,选择了2-3个等类似操作,也就是字段很多却选中很少的情况下此时性能会暴击提升,因为其余的7-8个字段根本不会被反射)

接下来的优化方向:内置json编码功能,提升反射性能

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.