我有这样一个用例,我们在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].

推荐答案

要用这种类型的查询字符串参数名称解组嵌套的键值,可以使用derekstavis/go-qs,这是Rack的查询字符串解析器的一个端口.

这将返回带有嵌套键值的map[string]interface{},如下所示.

值得注意的是,age的值是以字符串的形式返回的,但是,url.ParseQuery的值是相同的.如果需要将其封送到整数,则可以派生和修改包.

{
  "age": "12",
  "name": "abc",
  "notes": {
    "key1": "value1",
    "key2": "value2"
  }
}

Goplayground 上提供了一个完整的示例,其中包含以下代码:

Goplayground 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))
}

Go相关问答推荐

Go 1.22 net/http群组路由

如何创建两个连接的io.ReadWriteClosers以用于测试目的

Term~T中的类型不能是类型参数,但可以是引用类型参数的切片

为什么工具链指令在这种情况下没有效果?

GORM没有从 struct 创建完整的表,如何修复?

Golang测试容器,无法使网络正常工作

如何将文件从AWS S3存储桶复制到Azure BLOB存储

为什么Slices包中的函数定义Slice参数的类型参数?

3 字节切片和有符号整数类型之间的转换

用 fork 替换 Go 依赖:...用于两个不同的模块路径

Fizz对Gin的OpenAPI生成器正在重命名类型

「GORM错误」不支持的数据类型:&[],不正确的模式

从单词中删除特殊字符

此 Golang 程序中的同步问题

如何将 base64 编码的公钥转换为 crypto.PublicKey 或 ecdsa.PublicKey

AddE 上的 Apache Tinkerpop gremlin-go 驱动程序 Next() 返回E0903:没有剩余结果

golang 中的可变参数函数

有没有办法在一个 goroutine 返回后延迟后取消上下文?

Golang 泛型

如何访问 Go 模板中数组的第一个索引的值