英文:
Get nested key value pair of x-www-form-urlencoded request in JSON format in golang
问题
我有一个使用情况,我们在 x-www-form-urlencoded 的请求体中获取到了嵌套的键值对,如下所示:
name=abc&age=12&notes[key1]=value1&notes[key2]=value2
我尝试使用 url.ParseQuery("name=abc&age=12&notes\[key1\]=value1&notes\[key2\]=value2"),但它返回的结果是:
{
"name": "abc",
"age": 12,
"notes[key1]": "value1",
"notes[key2]": "value2"
}
我该如何将上述请求体的值转换为以下的 JSON 格式:
{
"name": "abc",
"age": 12,
"notes": {
"key1": "value1",
"key2": "value2"
}
}
有可能 notes 的嵌套层级可能达到 3 层。
我已经尝试过 url.ParseQuery 和 r.Form,但它们都只返回了 notes[key1] 和 notes[key2]。
英文:
I have use case where we are getting nested key value in x-www-form-urlencoded body like below
name=abc&age=12&notes[key1]=value1&notes[key2]=value2
I tried url.ParseQuery("name=abc&age=12&notes\[key1\]=value1&notes\[key2\]=value2") but it's giving
{
"name": "abc",
"age": 12,
"notes[key1]": "value1",
"notes[key2]": "value2"
}
How can I get this value in below JSON format for above body
{
"name": "abc",
"age": 12,
"notes": {
"key1": "value1",
"key2": "value2"
}
}
There is possibility that notes might be in 3 level nested format
I have tried url.ParseQuery and r.Form but both of them giving notes[key1] and notes[key2].
答案1
得分: 1
要解析具有此类型的查询字符串参数名称的嵌套键值,可以使用derekstavis/go-qs,它是Rack查询字符串解析器的一个端口。
这将返回一个带有嵌套键值的map[string]interface{},如下所示。
值得注意的是,
age的值返回为字符串,但是url.ParseQuery也是如此。如果希望将其编组为整数,可以分叉并修改该软件包。
{
"age": "12",
"name": "abc",
"notes": {
"key1": "value1",
"key2": "value2"
}
}
在Go Playground上有一个完整的示例,代码如下:
Go Playground URL: https://go.dev/play/p/Px7uZWRNs5V
package main
import (
"encoding/json"
"fmt"
"log"
qs "github.com/derekstavis/go-qs"
)
func main() {
v := "name=abc&age=12¬es[key1]=value1¬es[key2]=value2"
q, err := qs.Unmarshal(v)
if err != nil {
log.Fatal(err)
}
j, err := json.MarshalIndent(q, "", " ")
if err != nil {
log.Fatal(err)
}
fmt.Println(string(j))
}
英文:
To unmarshal nested key values with this type of query string parameter names, it's possible to use derekstavis/go-qs which is a port of Rack's query string parser.
This returns a map[string]interface{} with nested key values as follows.
> Of note, the value for age is returned as a string, however, this is the same for url.ParseQuery. If marshaling this to an integer is desired, the package can be forked and modified.
{
"age": "12",
"name": "abc",
"notes": {
"key1": "value1",
"key2": "value2"
}
}
A complete example is available on the Go Playground with the following code:
Go Playground URL: https://go.dev/play/p/Px7uZWRNs5V
package main
import (
"encoding/json"
"fmt"
"log"
qs "github.com/derekstavis/go-qs"
)
func main() {
v := "name=abc&age=12&notes[key1]=value1&notes[key2]=value2"
q, err := qs.Unmarshal(v)
if err != nil {
log.Fatal(err)
}
j, err := json.MarshalIndent(q, "", " ")
if err != nil {
log.Fatal(err)
}
fmt.Println(string(j))
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论