概述

最近掉进需求坑了,刚爬上来,评估排期出现了严重问题,下面三张图很符合当时的心境。

谈需求

估排期

开始干

为啥会这样,我简单总结了下:

  • 与第三方对接。
  • 跨团队对接。
  • 首次用 Go 做项目。
  • 业务流程没屡清楚就出排期(大坑)。
  • 需求调整后未进行调整排期(大坑)。

有了这次经验,后期关于如何评估排期也可以和大家唠唠。

废话不多说了,进入今天主题。

今天给大家分享用 Go 如何解析 JSON 数据,包含三种情况,强类型解析、弱类型解析、返回结构不确定 等。

JSON 结构

比如,请求了手机归属地的接口,json 数据返回如下:

{
"resultcode": "200",
"reason": "Return Successd!",
"result": {
"province": "浙江",
"city": "杭州",
"areacode": "0571",
"zip": "310000",
"company": "中国移动",
"card": ""
}
}

思路是这样的:

1.先将 json 转成 struct。

2.然后 json.Unmarshal() 即可。

json 转 struct ,自己手写就太麻烦了,有很多在线的工具可以直接用,我用的这个:

https://mholt.github.io/json-to-go/

在左边贴上 json 后面就生成 struct 了。

用代码实现下:

type MobileInfo struct {
Resultcode string `json:"resultcode"`
Reason string `json:"reason"`
Result struct {
Province string `json:"province"`
City string `json:"city"`
Areacode string `json:"areacode"`
Zip string `json:"zip"`
Company string `json:"company"`
Card string `json:"card"`
} `json:"result"`
} func main() {
jsonStr := `
{
"resultcode": "200",
"reason": "Return Successd!",
"result": {
"province": "浙江",
"city": "杭州",
"areacode": "0571",
"zip": "310000",
"company": "中国移动",
"card": ""
}
}
` var mobile MobileInfo
err := json.Unmarshal([]byte(jsonStr), &mobile)
if err != nil {
fmt.Println(err.Error())
}
fmt.Println(mobile.Resultcode)
fmt.Println(mobile.Reason)
fmt.Println(mobile.Result.City)
}

输出:

200
Return Successd!
杭州

完美解析。

到这问题还没结束,思考下这些问题:

如果 json 格式的数据类型不确定怎么办?

如果 json 格式的数据 result 中参数不固定怎么办?

思路是这样的:

去 github 上找开源类库,哈哈,我使用的是这个:

https://github.com/mitchellh/mapstructure

咱们一起学习下,先解决第一个问题,数据类型不确定怎么办?

先定义一个 string 类型的 resultcode,json 却返回了 int 类型的 resultcode。

看文档有一个弱类型解析的方法 WeakDecode(),咱们试一下:

type MobileInfo struct {
Resultcode string `json:"resultcode"`
} func main() {
jsonStr := `
{
"resultcode": 200
}
` var result map[string]interface{}
err := json.Unmarshal([]byte(jsonStr), &result)
if err != nil {
fmt.Println(err.Error())
} var mobile MobileInfo
err = mapstructure.WeakDecode(result, &mobile)
if err != nil {
fmt.Println(err.Error())
} fmt.Println(mobile.Resultcode)
}

输出:

200

第一个问题已解决。

再解决第二个问题,result 中参数不固定怎么办?

这个就不用上面的例子了,看下官方提供的例子 Example (EmbeddedStruct)

type Family struct {
LastName string
}
type Location struct {
City string
}
type Person struct {
Family `mapstructure:",squash"`
Location `mapstructure:",squash"`
FirstName string
} func main() {
input := map[string]interface{}{
"FirstName": "Mitchell",
"LastName": "Hashimoto",
"City": "San Francisco",
} var result Person
err := mapstructure.Decode(input, &result)
if err != nil {
panic(err)
} fmt.Println(result.FirstName)
fmt.Println(result.LastName)
fmt.Println(result.City)
}

输出:

Mitchell
Hashimoto
San Francisco

使用的是 mapstructure 包,struct tag 标识不要写 json,要写 mapstructure。

其他情况自己探索吧,比如: Example (Tags)

go-gin-api 系列文章

[系列] Go 如何解析 JSON 数据?的更多相关文章

  1. pyspider示例代码二:解析JSON数据

    本系列文章主要记录和讲解pyspider的示例代码,希望能抛砖引玉.pyspider示例代码官方网站是http://demo.pyspider.org/.上面的示例代码太多,无从下手.因此本人找出一下 ...

  2. 使用Python解析JSON数据的基本方法

    这篇文章主要介绍了使用Python解析JSON数据的基本方法,是Python入门学习中的基础知识,需要的朋友可以参考下:     ----------------------------------- ...

  3. 使用jQuery解析JSON数据

    我们先以解析上例中的comments对象的JSON数据为例,然后再小结jQuery中解析JSON数据的方法. 上例中得到的JSON数据如下,是一个嵌套JSON: {"comments&quo ...

  4. [转]javascript eval函数解析json数据时为什加上圆括号eval("("+data+")")

    javascript eval函数解析json数据时为什么 加上圆括号?为什么要 eval这里要添加 “("("+data+")");//”呢?   原因在于: ...

  5. 用jquery解析JSON数据的方法以及字符串转换成json的3种方法

    用jquery解析JSON数据的方法,作为jquery异步请求的传输对象,jquery请求后返回的结果是 json对象,这里考虑的都是服务器返回JSON形式的字符串的形式,对于利用JSONObject ...

  6. Android中使用Gson解析JSON数据的两种方法

    Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率;本文将介绍两种方法解析JSON数据,需要的朋友可以参考下   Json是一种类似于XML的通用数据交换格式,具有比XML更高的 ...

  7. fastjson生成和解析json数据,序列化和反序列化数据

    本文讲解2点: 1. fastjson生成和解析json数据 (举例:4种常用类型:JavaBean,List<JavaBean>,List<String>,List<M ...

  8. 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来的Json数据写入数据库表中

    摘自:http://blog.csdn.net/mazhaojuan/article/details/8592015 通过js获取前台数据向一般处理程序传递Json数据,并解析Json数据,将前台传来 ...

  9. JSONKit解析json数据

    先将第三方文件拖进工程 JSONKit.h和JSONKit.m 然后设置在ARC工程中添加MRC文件,如下图所示 #import "ViewController.h" #impor ...

随机推荐

  1. LeetCode73 Set Matrix Zeroes

    题目: Given a m x n matrix, if an element is 0, set its entire row and column to 0. Do it in place.(Me ...

  2. WebSocket 实时更新mysql数据到页面

    使用websocket的初衷是,要实时更新mysql中的报警信息到web页面显示 没怎么碰过web,代码写的是真烂,不过也算是功能实现了,放在这里也是鞭策自己,web也要多下些功夫 准备 引入依赖 & ...

  3. IDEA 通过数据库生成entity实体类

    IDEA利用数据库生成entity类教程 1.在左上角有一个View 选项 2. 然后选择 TOOL Windows 3. 然后选择Database然后会弹出一个窗口 4.选择+号 5.选择data ...

  4. Open Source Software List: The Ultimate List

    http://www.datamation.com/open-source/ Accessibility 1. The Accessibility Project The Business Value ...

  5. 学习CSS预处理器Less

    1.Sass与Less的区别:Sass与Less的区别 2.Less的使用:Less的使用 3.Less的相关网址:Less.js.Less中文网 Less的HSL函数-lighten():HSL函数 ...

  6. H3C V.24接口线缆

  7. phpstudy2016安装redis扩展

    第一步:查看phpstudy版本 第二步:查看phpinfo信息,看Architecture所属类型. 第三步:下载redis扩展 去http://windows.php.Net/downloads/ ...

  8. theadClasses设置Bootstrap Table表头样式

    通过theadClasses属性设置表头样式. thead-light设置灰色背景 //bootstrap table初始化数据 itxst.com $('#table').bootstrapTabl ...

  9. Python 函数参数有冒号 声明后有-> 箭头 返回值注释 参数类型注释

    在python3.7 环境下 函数声明时能在参数后加冒号,如图: 1 def f(ham: str, eggs: str = 'eggs') -> str : 2 print("Ann ...

  10. Python--day69--ORM正反向查找(外键)

    ForeignKey操作 正向查找 对象查找(跨表) 语法: 对象.关联字段.字段   示例: book_obj = models.Book.objects.first() # 第一本书对象 prin ...