Golang 解析 json字符串 json数组

1. 解析json字符串到结构体

将json字符串解析到结构体,因为这里的 common_policy_config 是json数组,没办法用字段来表示,所以需要用 []interface{} 来存。

package main

import (
	"encoding/json"

	"github.com/beego/beego/v2/adapter/logs"
)

type Request_common_policy_config struct {
	Action               string        `json:"action"`
	RetCodo              int32         `json:"retCode"`
	Common_policy_config []interface{} `json:"common_policy_config"`
}

func main() {

	test := "{\"action\":\"reponse_common_policy_config\",\"retCode\":0,\"common_policy_config\":[[3,15],\"1234\"]}"

	var config Request_common_policy_config

	err := json.Unmarshal([]byte(test), &config)

	if err != nil {
		logs.Info(err)
	}

	logs.Info(config)

	logs.Info("%T %v", config, config)
}

输出:
在这里插入图片描述

2. 解析json字符串

明确一点,当需要解析json的时候需要用到映射和空接口 map[string]interface{}
string 作为键的类型,interface{} 作为值类型,可以存放任何类型的对象。

package main

import (
	"encoding/json"
	"github.com/beego/beego/v2/adapter/logs"
)

func main() {

	test := "{\"action\":\"reponse_common_policy_config\",\"retCode\":0,\"common_policy_config\":[[3,15],\"1234\"]}"

	var config map[string]interface{}
	err := json.Unmarshal([]byte(test), &config)

	if err != nil {
		logs.Info(err)
	}

	logs.Info(config)
	logs.Info("%T %v", config, config)

	logs.Info("%T", config["common_policy_config"])
}

输出
在这里插入图片描述

3. 解析json数组

当json字符串为json数组时,我们发现map[string]interface{} 并不好使了。因为golang 的映射类型必须要键值成对出现,键是值得索引,没有键就拿不到值。

当看了上面 common_policy_config 的输出,我们发现json数组的类型是 []interface{},即空接口数组,数组的元素可以是任意对象。

通过for循环,我们就能取出数组中的所有值了。

package main

import (
	"encoding/json"

	"github.com/beego/beego/v2/adapter/logs"
)

func main() {

	test := "[[3,15],\"1234\"]"

	var config []interface{}
	err := json.Unmarshal([]byte(test), &config)

	if err != nil {
		logs.Info(err)
	}

	logs.Info(config)
	logs.Info("%T %v", config, config)

	Print(config)
}

func Print(a interface{}) {
	b, ok := a.([]interface{})
	if !ok {
		logs.Info("%T %v", a, a)
	} else {
		for _, info := range b {
			Print(info)
		}
	}
}

输出:
在这里插入图片描述

当数组里面套的是json对象时,上面的[]interface{} 就不够用了。这时候需要用切片来存放数组元素,用 map[string]interface{} 来存在元素对象,即json字符串。需要用到类型是 []map[string]interface{}

package main

import (
	"encoding/json"

	"github.com/beego/beego/v2/adapter/logs"
)

type Request_common_policy_config struct {
	Action               string        `json:"action"`
	RetCodo              int32         `json:"retCode"`
	Common_policy_config []interface{} `json:"common_policy_config"`
}

func main() {

	test := "[{\"action\":\"reponse_common_policy_config\",\"retCode\":0,\"common_policy_config\":[[3,15],\"1234\"]}]"

	var config []map[string]interface{}

	err := json.Unmarshal([]byte(test), &config)

	if err != nil {
		logs.Info(err)
	}

	logs.Info(config)

	logs.Info("%T %v", config, config)
}

输出:
在这里插入图片描述

不得不说,Golang处理json真的是太方便了。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值