英文:
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))
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论