-1

我正在为 POST 请求构建一个主体

relativeurl := "this-is-a-test-url"

postBody := fmt.Sprintf("{\"requests\": [{\"httpMethod\": \"GET\",\"relativeUrl\": \"%s\"}]}", relativeurl)

当我做 afmt.PrintlnpostBody,我看到:

{
"requests": [
    {
        "httpMethod": "GET",
        "relativeUrl": "this-is-a-test-url"}]}

但网址需要一个 JSON:

{
    "requests": [
        {
            "httpMethod": "GET",
            "relativeUrl": "this-is-a-test-url"
        }
]
}

我构建帖子正文的方式是否错误?

4

3 回答 3

2

只是提到另一种正确转义 JSON 字符串的方法:

// call the json serializer just on the string value :
escaped, _ := json.Marshal(relativeUrl)
// the 'escaped' value already contains its enclosing '"', no need to repeat them here :
body := fmt.Sprintf("{\"requests\": [{\"httpMethod\": \"GET\",\"relativeUrl\": %s}]}", escaped)

https://play.golang.org/p/WaT-RCnDQuK

于 2021-07-19T07:52:24.733 回答
1

您的两个 JSON 输出示例均有效且功能等效。JSON 中的空格并不重要。请参阅JSON.org上的以下内容:

可以在任何一对标记之间插入空格。

您可以使用encoding/json在线 JSON 解析器轻松测试和格式化 JSON。

但是,您使用的方法很容易出错,因为您的 URL 需要正确转义。例如,如果您的 URL 包含双引号 , ",您的代码将生成无效的 JSON。

在 Go 中,最好创建一些结构来进行编码。例如:

package main

import (
    "encoding/json"
    "fmt"
)

type RequestBody struct {
    Requests []Request `json:"requests"`
}

type Request struct {
    HTTPMethod  string `json:"httpMethod"`
    RelativeURL string `json:"relativeUrl"`
}

func main() {
    body := RequestBody{
        Requests: []Request{{
            HTTPMethod:  "GET",
            RelativeURL: "this-is-a-test-url",
        }},
    }

    bytes, err := json.MarshalIndent(body, "", "  ")
    if err != nil {
        panic(err)
    }

    fmt.Println(string(bytes))
}

这是一个正在运行的示例:

https://play.golang.org/p/c2iU6blG3Rg

于 2021-07-19T07:38:57.703 回答
0

您可以使用json包来处理 json 输入和输出。使用json.Unmarshal函数将 json 转换为 golang 结构,使用json.Marshal函数将 golang 结构转换为 json。

于 2021-07-19T07:18:50.690 回答