dataMap := make(map[string][]User)
json.Unmarshal([]byte(data), &dataMap)
for k, v := range dataMap {
log.Printf(`%v,%v`, k, v)
"ret":200,
"data":{
"32f49e76d7d16b76f0d49f15710b447236acfc90":{
"torrent":[
"sid":2,
"torrent_id":55171,
"info_hash":"32f49e76d7d16b76f0d49f15710b447236acfc90"
"cf7d88fd656d10fe5130d13567aec27068b96676":{
"torrent":[
"sid":10,
"torrent_id":36,
"info_hash":"8bf47a8baa8bf7927ec61a850959bca8405482f5"
"sid":1,
"torrent_id":7233,
"info_hash":"07bb8defd21288a30a54ad793fe615f81afdbb2b"
"sid":8,
"torrent_id":5821,
"info_hash":"a69b89a8df716982ecceff4b98c532fc538501ae"
"msg":"",
"version":"1.5.0"
处理的方法和例一类似
package main
import (
"encoding/json"
"fmt"
type ApiSitesInfoHash struct {
Ret int `json:"ret"`
Data Data `json:"data"`
Msg string `json:"msg"`
Version string `json:"version"`
type Data map[string]Torrents //自定义类型
type Torrents struct{ //结构体
Torrent []Torrent `json:"torrent"`
type Torrent struct{
Sid int `json:"sid"`
Torrent_id int `json:"torrent_id"`
Info_hash string `json:"info_hash"`
func main(){
r:=`{
"ret":200,
"data":{
"32f49e76d7d16b76f0d49f15710b447236acfc90":{
"torrent":[
"sid":2,
"torrent_id":55171,
"info_hash":"32f49e76d7d16b76f0d49f15710b447236acfc90"
"cf7d88fd656d10fe5130d13567aec27068b96676":{
"torrent":[
"sid":10,
"torrent_id":36,
"info_hash":"8bf47a8baa8bf7927ec61a850959bca8405482f5"
"sid":1,
"torrent_id":7233,
"info_hash":"07bb8defd21288a30a54ad793fe615f81afdbb2b"
"sid":8,
"torrent_id":5821,
"info_hash":"a69b89a8df716982ecceff4b98c532fc538501ae"
"msg":"",
"version":"1.5.0"
var dataMap ApiSitesInfoHash
json.Unmarshal([]byte(r), &dataMap)
for k, v := range dataMap.Data {
fmt.Println(k)
//fmt.Printf("%v",v.Torrent)
for _,v1:=range v.Torrent{
fmt.Println(v1.Sid,v1.Torrent_id,v1.Info_hash)
//fmt.Printf("%v",v1.Sid)
再补充一个例子
解析具有动态Key的对象
下面再做一下复杂的变化,如果把对象数组变为以Fruit
的Id
作为属性名的复合对象(object of object)比如:
"Fruit" : {
"1": {
"Name": "Apple",
"PriceTag": "$1"
"2": {
"Name": "Pear",
"PriceTag": "$1.5"
每个Key
的名字在声明类型的时候是不知道值的,这样该怎么声明呢,答案是把Fruit
字段的类型声明为一个Key
为string
类型值为Fruit
类型的map
type Fruit struct {
Name string `json:"name"`
PriceTag string `json:"priceTag"`
type FruitBasket struct {
Name string `json:"name"`
Fruit map[string]Fruit `json:"fruit"`
Id int64 `json:"id"`
Created time.Time `json:"created"`
可以运行下面完整的代码段试一下。
package main
import (
"fmt"
"encoding/json"
"time"
func main() {
type Fruit struct {
Name string `json:"name"`
PriceTag string `json:"priceTag"`
type FruitBasket struct {
Name string `json:"name"`
Fruit map[string]Fruit `json:"fruit"`
Id int64 `json:"id"`
Created time.Time `json:"created"`
jsonData := []byte(`
"Name": "Standard",
"Fruit" : {
"1": {
"name": "Apple",
"priceTag": "$1"
"2": {
"name": "Pear",
"priceTag": "$1.5"
"id": 999,
"created": "2018-04-09T23:00:00Z"
var basket FruitBasket
err := json.Unmarshal(jsonData, &basket)
if err != nil {
fmt.Println(err)
for _, item := range basket.Fruit {
fmt.Println(item.Name, item.PriceTag)
一般的用法可以参考https://www.cnblogs.com/yorkyang/p/8990570.html本文主要介绍json中动态字段 动态key的处理方法例子一json字段{ "friends": [ { "id": 0, "name": "Robinson Woods" } ...
t1 := Transport{Time: "22", Id: 44}
st = append(st, t1)
t2 := Transport{Time: "66", Id: 88}
st = append(st, t2)
st_json, _ := json.Marshal(s
VScode通过安装第三方开源Redis库来连接Redis
1) 使用第三方开源的redis库: github.com/garyburd/redigo/redis
2) 在使用Redis前,先安装第三方Redis库,在GOPATH路径下执行安装指令:
D:\goproject>go get github.com/garybu...
目前在做一个微型网关,一期的功能就是接收请求、匹配路由、鉴权、转发请求,再把响应接住并动态添加字段最后返回给调用方。
简单来说就是把请求方的响应接住,并在外层加上网关层特有的字段,如下
"response": {
"data":[],
"traceId":"1212121212112"
其中 response 和 traceId 就是网关动态加的,这个可以利用 golang 里的 map 属性来实现。
ret := map[string]interface{}{}
data :=
在 Golang 中,结构体的字段是在编译时确定的,因此不能动态增加字段。如果需要动态增加字段,可以考虑使用 map 类型,将字段名作为 key,字段值作为 value。
以下是一个示例代码:
```go
type Person struct {
Name string
Age int
Extra map[string]interface{}
func main() {
p := Person{Name: "John", Age: 30, Extra: make(map[string]interface{})}
p.Extra["Address"] = "123 Main St."
p.Extra["Phone"] = "123-456-7890"
fmt.Println(p) // Output: {John 30 map[Address:123 Main St. Phone:123-456-7890]}
在上面的代码中,我们为 `Person` 结构体类型增加了一个名为 `Extra` 的字段,类型为 `map[string]interface{}`。`Extra` 字段可以存储任意数量和类型的额外字段。
接着,我们创建了一个名为 `p` 的 `Person` 结构体实例,并在 `Extra` 字段中动态添加了两个字段:`Address` 和 `Phone`。
最后,我们使用 `fmt.Println` 函数打印出结构体变量 `p` 的值。输出结果为 `{John 30 map[Address:123 Main St. Phone:123-456-7890]}`,其中 `map[Address:123 Main St. Phone:123-456-7890]` 表示 `Extra` 字段的值。