项目中客户端和服务端的交互数据部分为json,因此在服务端就得解析,复杂的json解析起来其实还是挺费劲的。 
交互的数据类似如下格式:

{"sn":1,"ls":false,"bg":0,"ed":0,"ws":[{"bg":0,"cw":[{"sc":0,"w":"还"}]},{"bg":0,"cw":[{"sc":0,"w":"有点"}]},{"bg":0,"cw":[{"sc":0,"w":"眼熟"}]}]}

需要将json格式中的w字段取出来,并且拼成结果串进行展示

  1. 从json数组中获取ws
  2. ws是数组,数组元素为object
  3. cw是数组,数组元素为object
  4. w是string
  5. 从cw遍历获取w字段

初步实现如下:

func RecResultJsonToPlain() {
var recResult string
var dat map[string]interface{}
json.Unmarshal([]byte(json_str), &dat) if v, ok := dat["ws"]; ok {
ws := v.([]interface{})
for i, wsItem := range ws {
wsMap := wsItem.(map[string]interface{})
if vCw, ok := wsMap["cw"]; ok {
cw := vCw.([]interface{})
for i, cwItem := range cw {
cwItemMap := cwItem.(map[string]interface{})
if w, ok := cwItemMap["w"]; ok {
recResult = recResult + w.(string)
}
}
}
}
}
fmt.Println(recResult)
}

这样实现,一层一层去转换类型,再去获取元素有点麻烦。既然是已知的json数据结构,那么可以定义好结构体,再去进行解析。

type CWItem struct {
SC int32 `json:"sc"`
W string `json:"w"`
}
type WSItem struct {
CW []CWItem
} type IatResult struct {
SN int32 `json:"sn"`
LS bool `json:"ls"`
BG int32 `json:"bg"`
ED int32 `json:"ed"`
WS []WSItem `json:"ws"`
}

注意定义的时候变量名第一个字母要大写,也可以使用工具来自动生成定义https://mholt.github.io/json-to-go/;用工具生成的挺漂亮:

type AutoGenerated struct {
Sn int `json:"sn"`
Ls bool `json:"ls"`
Bg int `json:"bg"`
Ed int `json:"ed"`
Ws []struct {
Bg int `json:"bg"`
Cw []struct {
Sc int `json:"sc"`
W string `json:"w"`
} `json:"cw"`
} `json:"ws"`
}
func RecResultJsonToPlain(jsonResult []byte)(recPlainResult string)  {
var r IatResult
json.Unmarshal(jsonResult, &r)
for _, wsItem := range r.WS {
for _, cwItem := range wsItem.CW {
recPlainResult = recPlainResult + cwItem.W
}
}
return recPlainResult
}

上面的元素有json:"sn"强制说明,因此如果只需获取对应的元素,其他元素不定义也是可以的。另外还有一种数据就是数组当中的元素还是数组,并且最后数组包含的是number或者string类型,需要再重写一个函数才行,数据如下,获取[21,1]当中的元素

{"Asks": [[21, 1], [22, 1]] ,"Bids": [[20, 1], [19, 1]]}

搜索到一段代码如下,重新实现了UnmarshalJSON

package main

import (
"encoding/json"
"fmt"
) type Message struct {
Asks []Order `json:"Bids"`
Bids []Order `json:"Asks"`
} type Order struct {
Price float64
Volume float64
} func (o *Order) UnmarshalJSON(data []byte) error {
var v [2]float64
if err := json.Unmarshal(data, &v); err != nil {
return err
}
o.Price = v[0]
o.Volume = v[1]
return nil
} func main() {
b := []byte(`{"Asks": [[21, 1], [22, 1]] ,"Bids": [[20, 1], [19, 1]]}`)
var m Message
if err := json.Unmarshal(b, &m); err != nil {
fmt.Println(err)
return
}
fmt.Printf("%#v\n", m)
}

golang解析json格式 -- 全的更多相关文章

  1. WP8解析JSON格式(使用DataContractJsonSerializer类)(推荐)

    DataContractJsonSerializer是.NET自带的类,在解析JSON格式的时候使用起来方便快捷,至于生成方面由于暂时没用到就没去看了.使用需要引用System.Runtime.Ser ...

  2. WP8解析JSON格式(使用Newtonsoft.Json包)

    DOTA2 WebAPI请求返回的格式有两种,一种是XML,一种是JSON,默认是返回JSON格式. 这里举一个简单的解析JSON格式的例子(更多JSON操作): { "response&q ...

  3. 解析json格式数据

    实现目标 读取文件中的json格式数据,一行为一条json格式数据.进行解析封装成实体类. 通过google的Gson对象解析json格式数据 我现在解析的json格式数据为: {",&qu ...

  4. 用GSON解析Json格式数据

    GSON是谷歌提供的开源库,用来解析Json格式的数据,非常好用.如果要使用GSON的话,则要先下载gson-2.2.4.jar这个文件,如果是在Android项目中使用,则在Android项目的li ...

  5. 实现android上解析Json格式数据功能

    实现android上解析Json格式数据功能,该源码转载于安卓教程网的,http://android.662p.com ,个人感觉还不错的,大家可以看看一下吧. package com.practic ...

  6. Python3基础 json.loads 解析json格式的数据,得到一个字典

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  7. golang解析json报错:invalid character '\x00' after top-level value

    golang解析json报错:invalid character '\x00' after top-level value 手动复制字符串:{"files":["c:/t ...

  8. $Java-json系列(一):用GSON解析Json格式数据

    GSON是谷歌提供的开源库,用来解析Json格式的数据,非常好用.如果要使用GSON的话,则要先下载gson-2.2.4.jar这个文件,如果是在Android项目中使用,则在Android项目的li ...

  9. 使用google的GSON解析json格式的数据

    GSON是谷歌提供的开源库,用来解析Json格式的数据,非常好用.如果要使用GSON的话,则要先下载gson-2.2.4.jar这个文件,如果是在Android项目中使用,则在Android项目的li ...

随机推荐

  1. MNIST数据集转化为二维图片

    #coding: utf-8 from tensorflow.examples.tutorials.mnist import input_data import scipy.misc import o ...

  2. Linked List Cycle I&&II——快慢指针(II还没有完全理解)

    Linked List Cycle I Given a linked list, determine if it has a cycle in it. Follow up: Can you solve ...

  3. AC日记——「HNOI2017」礼物 LiBreOJ 2020

    #2020. 「HNOI2017」礼物 思路: A题进程: 一眼出式子->各种超时过不去->看题解明白还有fft这个东西->百度文库学习fft->学习dft->学习fft ...

  4. windows安装elasticsearch和elasticsearch-head插件

    1.去官网下载最新软件 选择zip包,https://www.elastic.co/downloads/elasticsearch 2.下载node 必须 > 6.0已上 3.解压elastic ...

  5. onethink 重写URL后,apache提示No input file specified

    <IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{RE ...

  6. mysql查看表结构,字段等命令

    mysql查看表结构命令,如下: desc 表名; show columns from 表名; describe 表名; show create table 表名;

  7. CodeForces 734E Anton and Tree

    $dfs$缩点,树形$dp$. 首先将连通块缩点,缩点后形成一个黑白节点相间的树.接下来的任务就是寻找一个$root$,使这棵树以$root$为根,树的高度是最小的(也就是一层一层染色).树形$dp$ ...

  8. 洛谷P3539 [POI2012] ROZ-Fibonacci Representation

    题目传送门 转载自:five20,转载请注明出处 本来看到这题,蒟蒻是真心没有把握的,还是five20大佬巨orz 首先由于斐波拉契数的前两项是1,1 ,所以易得对于任何整数必能写成多个斐波拉契数加减 ...

  9. Express使用MongoDB常用操作

    const MongoClient = require('mongodb').MongoClient const url = "mongodb://localhost:27017" ...

  10. B/S架构和C/S架构

    一.B/S架构 B/S结构(Browser/Server,浏览器/服务器模式),是WEB兴起后的一种网络结构模式,WEB浏览器是客户端最主要的应用软件.这种模式统一了客户端,将系统功能实现的核心部分集 ...