flask json传输失败_golang解析json数据(Encoding/Json)

今天我们看一下如何用golang的标准库(Encoding/Json)实现对json数据的解析。

json数据格式是大多数api通信使用的一种数据传输格式。

如果想了解json数据格式的同学,请移步:https://baike.baidu.com/item/JSON/2462549

不清楚golang环境搭建运行HelloWorld的同学,请参考:

sunny翰:golang环境搭建之“Hello world”​zhuanlan.zhihu.com

言归正传,我们从以下几个方面介绍Encoding/Json库的使用。

1、创建一个json数据的文件(users.json)

{
  

2、读取users.json文件

package 
>> go run main.go
>> 输出:Successfully Opened users.json

3、构造users.json文件中的结构体Struct

我们需要根据users.json文件中的json格式,构造结构体。

可以利用网上开源工具:https://mholt.github.io/json-to-go/

947c4c391b311825f316a046e7af9c7f.png

这样我们构造结构体的时候,能达到事半功倍的效果。

type 

我们得到了这样的json结构体,看上去比较复杂,不宜读。接下来,我们对结构体进行拆解:

type Users struct {
    Users []User `json:"users"`
}

type User struct {
    Name   string `json:"name"`
    Age    int    `json:"Age"`
    Social Social `json:"social"`
}

type Social struct {
    Zhihu string `json:"zhihu"`
    Weibo string `json:"weibo"`
}

这样来看,整个结构体就相当的清晰了。

4、解析Json文件的数据

这里会用到json.Unmarshal()函数
package 
>> go run main.go
运行结果如下:

Successfully Opened users.json

User Name: Aric

User Age: 27

Zhihu Url: https://zhihu.com

Weibo Url: https://weibo.com

User Name: gloria

User Age: 22

Zhihu Url: https://zhihu.com

Weibo Url: https://weibo.com

把这段代码转化为python代码(package service import ( "encoding/json" "errors" "fmt" "gin-syudy/api/device/req" "gin-syudy/define" "gin-syudy/models" "gin-syudy/mqtt" "gin-syudy/tools/resp" "gin-syudy/utils" mq "github.com/eclipse/paho.mqtt.golang" "github.com/gin-gonic/gin" "log" "net/http" "strconv" "time" ) // DeviceController 控制设备 // @BasePath /api/v1 // @Description 启动对应设备 // @Tags 启动设备 // @param identity query string false "Identity" // @param controllerId query string false "controllerId" // @param controlState query string false "controlState" // @Success 200 {object} resp.Response "{"code":200,"data":[...]}" // @Failure 502 {object} resp.Response "{"code":502,"data":[...]}" // @Router /api/v1/device/start [Post] func DeviceController(c *gin.Context) { device := new(models.DeviceBasic) write := new(mqtt.Write) device.Identity = c.Query("identity") id, _ := strconv.Atoi(c.Query("controllerId")) fmt.Println(id) state, _ := strconv.Atoi(c.Query("controllerState")) fmt.Println(state) write.Id = uint32(id) write.State = uint32(state) if device.Identity == "" { resp.RespFail(c, http.StatusBadGateway, errors.New("必填参数为空"), resp.FoundFail) return } deviceBasic := device.GetTopicByIdentity() subTopic := "Device/" + deviceBasic.ItemName + "/" + deviceBasic.BridgeName + "/control" + deviceBasic.Secret fmt.Println(subTopic) sendTopic := "Host/" + deviceBasic.ItemName + "/" + deviceBasic.BridgeName + "/control" + deviceBasic.Secret fmt.Println(sendTopic) dataChan := make(chan *mqtt.StartDataResp, 1) mqtt.SubscribeMessage(subTopic, func(client mq.Client, message mq.Message) { fmt.Printf("MESSAGE : %s\n", message.Payload()) fmt.Printf("TOPIC : %s\n", message.Topic()) subscribeStartData := new(mqtt.StartDataResp) err := json.Unmarshal(message.Payload(), &subscribeStartData) if err != nil { resp.RespFail(c, http.StatusBadGateway, err, "回调函数格式不正确") return } dataChan <- subscribeStartData }) startData := new(mqtt.StartData) startData.SampTime = time.Now().String() startData.CommandID = utils.GetUUid() startData.Write = write data, _ := json.Marshal(startData) err := mqtt.SendMessage(sendTopic, data) if err != nil { resp.RespFail(c, http.StatusBadGateway, err, resp.FoundFail) return } responseMessage := <-dataChan err, _ = mqtt.Unsubscribe(sendTopic) if err != nil { resp.RespFail(c, http.StatusBadGateway, err, "取消订阅失败") return } resp.RespOK(c, responseMessage, "控制成功") })
06-07
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值