英文:
make a map with different data types in go for making post request with json data
问题
我正在尝试在Go/Golang中创建一个键值对的映射,并在进行HTTP POST请求之前使用json.Marshal进行序列化。
jsonData的结构如下:
{
    "name":"bob",
    "stream":"science",
    "grades":[
        {
            "maths":"A+",
            "science":"A"
        }
    ]
}
这个映射的结构是这样的:它有字符串类型的键,值可以是字符串,还可以是一个切片,而切片本身又包含一个映射。所以从Python的角度来看,我想创建一个字典,其中有键值对,但最后一个键的值是一个列表,而列表中又包含一个字典。
代码中的一部分如下:
postBody, err := json.Marshal(map[string]interface{}{
    "name": name,
    "stream": stream,
    "grades": [
        {
            sub1: sub1_score,
            sub2: sub2_score
        }
    ]
})
但是我无法创建这种复杂的映射。
英文:
I am trying to create a map of key values and then json.Marshal it before making an HTTP post request in Go/Golang
jsonData
{"name":"bob",
"stream":"science",
"grades":[{"maths"    :"A+",
           "science"  :"A"}]
}
The structure of the map is like, it has string typed keys and values are strings and a slice and the slice itself has a map. So in terms of python I want to make a dictionary which has key value pairs but last key's value is a list and the list has a dictionary in it.
a part from code is this:
postBody, err := json.Marshal(map[string]interface{}{
		"name":name,
        "stream":stream,
        "grades":[{sub1  :sub1_score,
                   sub2  :sub2_score}]
	    })
but failed to make this kind of complex map.
答案1
得分: 2
postBody, err := json.Marshal(map[string]interface{}{
    "name":   name,
    "stream": stream,
    "grades": []map[string]interface{}{{
        sub1: sub1_score,
        sub2: sub2_score,
    }},
})
或者,如果你不想重新输入 map[string]interface{}
type Obj map[string]interface{}
postBody, err := json.Marshal(Obj{
    "name":   name,
    "stream": stream,
    "grades": []Obj{{
        sub1: sub1_score,
        sub2: sub2_score,
    }},
})
https://go.dev/play/p/WQMiE5gsx9w
英文:
postBody, err := json.Marshal(map[string]interface{}{
	"name":   name,
	"stream": stream,
	"grades": []map[string]interface{}{{
        sub1: sub1_score,
        sub2: sub2_score,
    }},
})
or, if you'd like to avoid having to retype map[string]interface{}
type Obj map[string]any
postBody, err := json.Marshal(Obj{
	"name":   name,
	"stream": stream,
	"grades": []Obj{{
        sub1: sub1_score,
        sub2: sub2_score,
    }},
})
答案2
得分: 0
Go是一种静态类型语言。
一个空接口可以保存任何类型的值。但是你的嵌套列表没有类型。
之前
[{sub1  :sub1_score, sub2  :sub2_score}]
之后
[]map[string]interface{}{
	{
        sub1: sub1_score,
	    sub2: sub2_score,
    },
}
英文:
Go is a statically typed language.
An empty interface may hold values of any type. But your nested list has no type.
Before
[{sub1  :sub1_score, sub2  :sub2_score}]
After
[]map[string]interface{}{
	{
        sub1: sub1_score,
	    sub2: sub2_score,
    },
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论