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 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...
}
golang 兼容不同json结构体解析实践的更多相关文章
- Golang通过反射获取结构体的标签
Golang通过反射获取结构体的标签 例子: package main import ( "fmt" "reflect" ) type resume struc ...
- golang 处理 json 结构体
首先 我们来看一下这个json 字串 { "resp": { ", "respMsg": "成功", "app" ...
- Golang通过结构体解析和封装XML
Golang解析和封装XML 解析XML成结构体Demo package main import ( "encoding/xml" "fmt" ) //我们通过 ...
- Go语言使用匿名结构体解析JSON数据
手机拥有屏幕.电池.指纹识别等信息,将这些信息填充为 JSON 格式的数据.如果需要选择性地分离 JSON 中的数据则较为麻烦.Go 语言中的匿名结构体可以方便地完成这个操作. 首先给出完整的代码,然 ...
- Golang 通过创建临时结构体实现 struct 内 interface struct 的 json 反序列化
原文链接 背景 type AData struct { A string `json:"a"` } type BData struct { B string `json:" ...
- file_operations结构体解析 1
注:学了这么长时间了,还没有好好看看 file_operations机构体,这其中还有很多的东西,当你学着学着的时候,就会用到这里面的一些系统调用对应的函数了,我在网上搜索之后,记录如下,一边将来查看 ...
- golang 使用reflect反射结构体
"反射结构体"是指在程序执行时,遍历结构体中的字段以及方法. 1.反射结构体 下面使用一个简单的例子说明如何反射结构体. 定义一个结构体,包括3个字段,以及一个方法. 通过refl ...
- struct 结构体解析(原)
(一)基本概念 结构体是一个或是多个变量的集合,这些变量可能为不同的类型,为了处理的方便而将这些变量组合在一个名字之下.我们将关键字struct引入了结构声明中.结构声明包含在花括号内的一系列声明组成 ...
- 用结构体解析Pascal字符串
来源:https://www.cnblogs.com/qiuyuwutong/p/8708844.html 1.什么是柔性数组? 柔性数组既数组大小待定的数组, C语言中结构体的最后一个元素可以是大小 ...
随机推荐
- shell-day1
shell概述:这里说的是命令行shell,例如"bash/sh/ksh/csh"(Unix/Linux系统).cmd.exe命令提示字符(windwos系统),这里主要介绍Uni ...
- AngularJS中页面传参方法
1.基于ui-router的页面跳转传参 (1) 用ui-router定义路由,比如有两个页面,一个页面(producers.html)放置了多个producers,点击其中一个目标,页面跳转到对应的 ...
- UVa 12186 - Another Crisis(树形DP)
链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- php无极限分类函数
/** * [make_tree description] * @Author Lerko * @DateTime 2017-04-01T14:57:24+0800 * @param [type] $ ...
- centos 在安装YouCompleteMe时提示 Fatal : pyconfig.h No such file or directory
问题:centos 在安装YouCompleteMe时提示 Fatal : pyconfig.h No such file or directory 解决:安装python-devel yum ins ...
- 华为交换机SSH配置
设备:S5700 一.在本地设备服务端生成秘钥对 [Huawei]rsa local-key-pair create 二.配置VTY [Huawei]user-interface vty 0 4进入虚 ...
- Spring data JPA先排序再分页。
//工具类,增删改查等等package com.yunqing.service.impl; import java.util.Map; import org.springframework.beans ...
- C#与C++通过socket传送结构体
C#服务端: using System; using System.Net.Sockets; using System.Net; using System.IO; using System.Diagn ...
- FactoryBean的实现原理与作用
FactoryBean与BeanFactory: 这俩货在拼写上很是相似,很多同学在看IOC源码或者其他地方并不能分清有啥区别,前面的IOC源码中我简单说过,现在统一简单来讲一下: FactoryBe ...
- MVC学习十:MVC 特性作用和MVC 验证
根据代码分析特性用处 [DisplayName("学员名")] [DataType(DataType.Text)] [StringLength(,ErrorMessage=&quo ...