golang json搜索多层级 判断 json查询表达式

背景

因为项目上要求,在做数据推送的时候需要根据json的内容将不同的数据推送到不同的地址中,所以我开发了这个rule条件的配置插件,根据rule的配置可以搜索出满足条件的json数据,然后根据项目中配置的推送地址将数据推送出去。

Json条件检索

go语言,通过rule条件筛选出json是否可用。可以在批量的json中快速筛选出满足条件的json。

数据筛选支持多层数据搜索,可以通过.进行多层惊悚node分割,也可以对数组进行搜索。代码可能存在很多不足,请大家多多指点共同进步,希望大家能一起参与进来。

example中有试用方式请参考试用。

Rule协议

条件运算符:说明:
and等于,操作数据等于对象中的数据
or或,操作数据或,等于其中一个即可
not不等于,操作数据不等于对象中的数据
gt大于,操作数据大于对象中的数据,必须为int或float类型的数据
gte大于等于,操作数据大于或等于对象中的数据,必须为int或float类型的数据
lt小于,操作数据小于对象中的数据,必须为int或float类型的数据
lte小于等于,操作数据小于或等于对象中的数据,必须为int或float类型的数据
like模糊,操作数据会模糊查询对象中定义的数据前、后、中间出现过大于一次的命中,必须为string类型
协议示例
{
  "and": {
    "projectId": "10001",
    "code": "test-push"
  },
  "or": {
    "projectId": "10001",
    "code": "test-push"
  },
  "not": {
    "projectId": "10001",
    "code": "test-push"
  },
  "gt": {
    "age": 10,
    "number": 5
  },
  "gte": {
    "age": 10,
    "number": 5
  },
  "lt": {
    "age": 10,
    "number": 5
  },
  "lte": {
    "age": 10,
    "number": 5
  },
  "like": {
    "name": "你好"
  }
}

Data数据

data为rule筛选的数据源。

{
  "projectId": "10001",
  "code": "test-push",
  "name": "xiaoming",
  "days": [
    "one",
    "two",
    "three"
  ]
}

介绍完毕直接上demo

package main

import (
	"fmt"

	jCondition "github.com/liuz-code/json-condition"
)

func main() {
	//----------------and
	// data := "{\"projectId\":\"10001\",\"code\":\"test-push\",\"productCode\":\"cvforce\",\"class\":{\"name\":\"小明\"}}"
	// rule := "{\"and\":{\"projectId\":\"10001\",\"code\":\"test-push\",\"class.name\":\"小明\"}}"
	//----------------or
	// data := "{\"projectId\":\"10001\",\"code\":\"test-push\",\"productCode\":\"cvforce\"}"
	// rule := "{\"or\":{\"projectId\":\"10001\",\"code\":\"test-push1111\"}}"
	//----------------not
	// data := "{\"projectId\":\"10001\",\"code\":\"test-push\",\"productCode\":\"cvforce\"}"
	// rule := "{\"not\":{\"projectId\":\"10004\",\"code\":\"test-push1111\"}}"
	//----------------gt
	// data := "{\"age\":15,\"year\":2024}"
	// rule := "{\"gt\":{\"age\":11,\"year\":2023}}"
	//----------------gte
	// data := "{\"age\":15,\"year\":2024}"
	// rule := "{\"gte\":{\"age\":15,\"year\":2023}}"
	//----------------lt
	// data := "{\"age\":15,\"year\":2024}"
	// rule := "{\"lt\":{\"age\":16,\"year\":2025}}"
	//----------------lte
	// data := "{\"age\":15,\"year\":2024}"
	// rule := "{\"lte\":{\"age\":16,\"year\":2024}}"
	//----------------like
	// data := "{\"projectId\":\"10001\",\"code\":\"test-push\",\"name\":\"xiaoming\"}"
	// rule := "{\"like\":{\"name\":\"ao\"}}"
	//----------------and like
	data := "{\"projectId\":\"10001\",\"code\":\"test-push\",\"name\":\"xiaoming\",\"days\":[\"one\",\"two\",\"three\"]}"
	rule := "{\"like\":{\"name\":\"ao\"},\"and\":{\"projectId\":\"10001\",\"days.[0]\":\"one\"}}"
	var d jCondition.JsonCondition
	b, err := d.JsonCheck(data, rule)
	fmt.Println("check:", b, ", err:", err)
}

程序会根据rule配置判断出data节点中的数据是否满足条件。

数据来源:GitHub - liuz-code/json-condition: go语言,通过条件筛选出json是否满足。可以在批量的json中快速筛选出满足条件的json。

  • 25
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值