go json反序列化成指定类型

简介

简单的介绍一下使用go的json库,将json字符串反序列化成接口中指定的实现类

代码如下

复制代码
package usejson

type ExamInterface interface {
	CheckRule(data any) bool
}

type IntStru struct {
	DefalutVal int `json:"defalut_val"`
	Max        int `json:"max"`
	Min        int `json:"min"`
}

func (i IntStru) CheckRule(data any) bool {
	if data.(int) < i.Max && data.(int) > i.Min {
		return true
	}
	return false
}

func (i IntStru) New() {

}

type StringStru struct {
	DefaultVal string `json:"default_val"`
	Len        int    `json:"len"`
}

func (s StringStru) CheckRule(data any) bool {
	if len(data.(string)) > s.Len {
		return false
	}
	return true
}
func (s StringStru) New() {

}

测试用例

复制代码
package usejson

import (
	"encoding/json"
	"fmt"
	"testing"
)

func TestRule(t *testing.T) {
	val := "{\"int\":{\"defalut_val\":0,\"max\":500,\"min\":30}}"
	var exam = map[string]interface{}{}
	err := json.Unmarshal([]byte(val), &exam)
	if err != nil {
		panic(err)
	}
	if val, ok := exam["int"]; ok {
		data, _ := json.Marshal(val)
		intr := &IntStru{}
		json.Unmarshal(data, intr)
		fmt.Println(intr.CheckRule(3))
	}
	val = "{\"string\":{\"default_val\":\"\",\"len\":3}}"
	err = json.Unmarshal([]byte(val), &exam)
	if err != nil {
		panic(err)
	}
	if val, ok := exam["string"]; ok {
		data, _ := json.Marshal(val)
		intr := &StringStru{}
		json.Unmarshal(data, intr)
		fmt.Println(intr.CheckRule("333"))
	}
}

func TestMashal(t *testing.T) {
	s := StringStru{Len: 3}
	data, _ := json.Marshal(s)
	fmt.Println(string(data))
	i := IntStru{Max: 500, Min: 30}
	data, _ = json.Marshal(i)
	fmt.Println(string(data))
}

总结

其实主体逻辑在测试用例中,根据json字符串中特定字符串确定是将json串解析成何种子类,逻辑比较简单。

相关推荐
n8n4 分钟前
Java 21 虚拟线程(Virtual Threads)
后端
Csvn23 分钟前
🐍 Day 5: Python 函数详解 — 参数、作用域与一等公民
人工智能·后端
wno70430 分钟前
Spring Boot中使用Servlet
spring boot·后端·servlet
老郑聊AI业财智造37 分钟前
Spring AI 技术架构与源码分析
java·人工智能·后端·spring·架构·软件工程
程序员与背包客_CoderZ39 分钟前
高性能分布式KV存储引擎RocksDB入门与C/C++编码实战
c语言·开发语言·数据库·c++·分布式·分布式数据库·rocksdb
省长43 分钟前
别人绕过我的网关直接调用资源服务怎么办?使用 Sa-Token 解决:网关转发鉴权、RPC调用鉴权
java·后端·开源
MetaLite1 小时前
SpringBoot异常处理-到底该转换还是继续抛-入口层与调用层不能一刀切
java·spring boot·后端
钱栈up1 小时前
Mac 开发机一键发版不用切环境:我这样改造了团队的后端部署脚本Maven编译卡住20分钟?我靠两步定位到2处隐蔽编译错误
开发语言·python·macos
william_yangshun1 小时前
【大模型部署实战】kimi-k3-in-c 中文版:用 176KB 纯 C99 引擎在 CPU 上跑 Kimi K3 上手指南
c语言·开发语言
Sagittarius_A*1 小时前
Burst Lab | PHP 审计 14|反序列化(四):字符串逃逸与绕过技巧
开发语言·安全·php·web·反序列化