在golang中获取JSON格式的x-www-form-urlencoded请求的嵌套键值对

hivapdat  于 2023-06-27  发布在  Go
关注(0)|答案(1)|浏览(229)

我有一个用例,我们在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"
  }
}

注解可能采用3级嵌套格式
我试过url.ParseQueryr.Form,但它们都给了notes[key1]notes[key2]

lyfkaqu1

lyfkaqu11#

要使用这种类型的查询字符串参数名称解组嵌套的键值,可以使用Rack的查询字符串解析器的端口derekstavis/go-qs
这将返回一个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&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))
}

相关问题