golang 兼容不同json结构体解析实践

线上服务器,同一个web接口有时需要兼容不同版本的结构体。这种情况思路是使用interface{}接收任意类型数据,结合reflect包处理。

如下,http接口调用者会传入不同的json结构数据(单体结构或切片结构):

type ReqStu struct {
	XXX struct {                    //XXX结构为单体
		AAA    string `json:"aaa"`
		BBB    string `json:"bbb"`
		CCC    string `json:"ccc"`
	} `json:"xxx"`
}

  

type ReqStu struct {
	XXX []struct {                //XXX为数据体切片
		AAA    string `json:"aaa"`
		BBB    string `json:"bbb"`
		CCC    string `json:"ccc"`
	} `json:"xxx"`
}

  

兼容不同XXX结构体的方法是使用interface{},接收任意类型数据。

type ReqStu struct {
	XXX     interface{} `json:"xxx"`
}

代码实现方面,使用反射判断XXX类型kind,switch判断分别解析处理数据。

switch reflect.ValueOf(Req.XXX).Kind() {//通过反射kind方法获取XXX数据类型
	case reflect.Slice, reflect.Array://切片或数组类型的处理
		var SliceTemp = []struct {
			AAA    string `json:"aaa"`
			BBB    string `json:"bbb"`
			CCC    string `json:"ccc"`
			}{} 

		if err := json.Unmarshal([]byte(Req),&SliceTemp );err != nil{
            return
		}
    //range操作SliceTemp...

	default://默认单结构体
		var SingleTemp = struct {
			AAA    string `json:"aaa"`
			BBB    string `json:"bbb"`
			CCC    string `json:"ccc"`
		}{}	

		if err := json.Unmarshal([]byte(Req),&SingleTemp );err != nil{
			return
		}
    //操作SingleTemp...
}

原文地址:https://www.cnblogs.com/brave-xin/p/9900915.html

时间: 2024-10-11 03:39:20

golang 兼容不同json结构体解析实践的相关文章

在Golang里如何实现结构体成员指针到结构体自身指针的转换

原文地址:http://goworldgs.com/?p=37 在C语言中有一个经典的宏定义,可以将结构体struct内部的某个成员的指针转化为结构体自身的指针.下面是一个例子,通过FIELD_OFFSET宏计算结构体内一个字段的偏移,函数getT可以从一个F*的指针获得对应的T*对象. struct F { int c; int d; } struct T{ int a; int b; struct F f; } #define FIELD_OFFSET(type, field) ((int)

file_operations结构体解析 1

注:学了这么长时间了,还没有好好看看 file_operations机构体,这其中还有很多的东西,当你学着学着的时候,就会用到这里面的一些系统调用对应的函数了,我在网上搜索之后,记录如下,一边将来查看..... 前沿:这些东西估计对你有用 linux驱动程序中最重要的涉及3个重要的内核数据结构,分别为file_operations,file和inode. 在linux中inode结构用于表示文件,而file结构则表示打开的文件的描述,因为对于单个文件而言可能会有许多个表示打开的文件的描述符,因而

一种向后兼容的C++结构体设计

问题产生的背景:有时候,我们需要维护老旧代码.这些代码经常因为需求变更而变化.最常见的升级就是接口的升级,诸如增加新的函数接口.扩展函数的参数.扩展协议等等.在此我们讨论一种较为少见的情形,即存储于设备中的一段二进制结构的升级.这种情况类似于网络通讯中的序列化,但又有所不同.关于如何设计序列化结构的文章有许多,我们在此不做讨论.设计目标: 1. 为了兼容老版本的结构体 2. 为了支持内存拷贝初始化3. 版本号的支持4. 尽量少的代码修改 假设我们第一次(旧)的数据结构如下: struct Old

golang 碎片整理之 结构体

什么是结构体? 结构体(struct)是用户自定义的类型,它代表若干字段的集合,可以用于描述一个实体对象,类似Java中的class,是golang面向对象编程的基础.结构体的概念在软件工程上的旧术语是ADT(抽象数据类型: Abstract Date type).在c++它也是存在,并且名字也是struct,在面向对象的编程语言中,跟一个无方法的轻量级类一样.因为在Go语言中没有类的概念,所以在go中结构体有着很重要的地位. 如何定义一个结构体 type Coordinate struct {

golang 使用reflect反射结构体

"反射结构体"是指在程序执行时,遍历结构体中的字段以及方法. 1.反射结构体 下面使用一个简单的例子说明如何反射结构体. 定义一个结构体,包括3个字段,以及一个方法. 通过reflect包,首先查看这个结构体对应的动态类型reflect.Type和动态值reflect.Value,并查看这个结构体对应的基本类型. 接着查看结构体的字段数量,并遍历每个字段. 打印每个字段的类型.值.以及tag标签. 最后,调用结构体中的方法,并打印返回结果. 具体代码如下. package main i

Z-stack关键结构体解析

OSAL的消息队列 每一个消息都包含一个消息头osal_msg_hdr_t和用户自定义的消息,osal_msg_hdr_t结构体定义如下: typedef struct { void *next; uint16 len; uint8 dest_id; } osal_msg_hdr_t; 在事件处理函数SampleApp_ProcessEvent()中,从消息队列中接收到一个消息,后才调用SampleApp_MessageMSGCB,接收到的消息中如何就包含了用户接收的数据消息呢? 是这样子的:每

换个语言学一下 Golang (9)——结构体和接口

基本上到这里的时候,就是上了一个台阶了.Go的精华特点即将展开. 结构体定义 上面我们说过Go的指针和C的不同,结构体也是一样的.Go是一门删繁就简的语言,一切令人困惑的特性都必须去掉. 简单来讲,Go提供的结构体就是把使用各种数据类型定义的不同变量组合起来的高级数据类型.闲话不多说,看例子: type Rect struct { width float64 length float64 } 上面我们定义了一个矩形结构体,首先是关键是type表示要定义一个新的数据类型了,然后是新的数据类型名称R

LR socket接收数据 标准函数,结构体解析

//接收 DWORD RecvBuf(char* cRecvBuf,char* cSocketName,char* cBufName){    int ret=0;    char * cRecvdata=0;    int iRecvdatalen=0;    DWORD begin=0,cur=0;    begin=clock();    while(1)    {        ret=lrs_receive(cSocketName,cBufName,LrsLastArg);      

golang 使用匿名结构体的问题

golang允许使用匿名结构体,形如 type Test struct { param1 struct { param2 string } } 一般在使用的时候可以直接这样初始化 a := Test{ param1: struct{ param2 string }{param2: "test"}, } 或者 b := new(Test) b.param1.param2 = "test" 但今天遇到一种情况 匿名结构体的成员上有tag声明,形如 type Test s