为了账号安全,请及时绑定邮箱和手机立即绑定

来自 csv 文件的 JSON 格式的 Golang POST 请求

来自 csv 文件的 JSON 格式的 Golang POST 请求

Go
收到一只叮咚 2022-06-13 15:06:02
所以我正在尝试将 JSON 格式的 csv 文件发布到 Golang 中的网站。我已经成功发布了一个单一的 JSON 文件。但是,这不是我希望我的程序的目的。基本上,我正在尝试为网站创建一个帐户生成器。我希望能够一次生成多个帐户。我觉得最好的方法是使用 csv 文件。我尝试使用 encoding/csv 来读取 csv 文件,然后编组为 JSON。另外,ioutil.ReadFile(). 但是,该站点的响应是,“名字是必填字段,姓氏是必填字段”等。因此,这显然意味着 csv 数据不会进入 JSON 格式。我将在下面使用 ioutil.ReadFile() 显示我的代码。func main() {file, _ := ioutil.ReadFile("accounts.csv")    jsonConv, _ := json.Marshal(file)    client := http.Client{}    req, err := http.NewRequest("POST", "websiteUrlHere", bytes.NewBuffer(jsonConv))    req.Header.Add("cookie", `"really long cookie goes here"`)    req.Header.Set("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36")    req.Header.Set("content-type", "application/json")    resp, err := client.Do(req)    if err != nil {        fmt.Print(err)    }    defer resp.Body.Close()}(^ 这只是代码片段)。我对这一切还是很陌生,所以请理解这个问题是否缺少任何东西。我也寻找过类似的问题,但我发现的只是结构的使用。我觉得这不适用于此,因为目标是一次创建无限帐户。希望以上内容就足够了。谢谢你。
查看完整描述

2 回答

?
不负相思意

TA贡献1777条经验 获得超10个赞

您的代码的问题实际上是您正在尝试将文件转换为字节:


file, _ := ioutil.ReadFile("accounts.csv")

...然后您再次尝试将该字节片段转换为 JSON 字节:


jsonConv, _ := json.Marshal(file)

文件的文本内容作为字节切片存储在变量file中,然后该字节切片(字节形式的文件内容)被转换为 JSON 字节数组。所以你基本上是在发送一个 JSON 数字数组......不好。


这里的正常流程是获取file字节,然后从中创建一个 Go 结构。一旦你的 Go 对象就位,那么你将编组为 JSON。这会将 Go 对象转换为 JSON 文本形式之后的字节切片。


因此,您缺少的是 Go 结构中间步骤,但您还应该记住,将 Go 结构转换为 JSON 字节json.Marshal()只会显示导出的字段。此外,通常您应该使用 struct 标签来准确自定义字段的显示方式。


你最好的选择就是坚持使用 JSON,忘记 CSV。在您自己的代码示例中,您正在获取一个 CSV,然后尝试将其转换为 JSON……那么,只需使用 JSON。


如果您想发送多个帐户,只需将您的 Go 结构设为一个切片,它将编组为一个 JSON 数组,这基本上就是您想要做的。最终结果将是一个 JSON 帐户数组。这是一个简单的例子:


package main


import (

    "fmt"

    "encoding/json"

)


type Account struct {

    Username string `json:"username"`

    Email string `json:"email"`

}


type AccountsRequest struct {

    Accounts []Account `json:"accounts"`

}


func main() {

    //gather account info

    acct1 := Account{Username: "tom", Email: "tom@example.com"}

    acct2 := Account{Username: "dick", Email: "dick@example.com"}

    acct3 := Account{Username: "harry", Email: "harry@example.com"}

    

    //create request

    acctsReq := AccountsRequest{Accounts: []Account{acct1, acct2, acct3}}

    

    //convert to JSON bytes/data

    //jsonData, _ := json.Marshal(acctsReq)

    

    //debug/output

    jsonDataPretty, _ := json.MarshalIndent(acctsReq, "", "  ")

    fmt.Println(string(jsonDataPretty))

    

    //send request with data

    //...

}

可在操场上运行。


关键是结构已设置好并准备就绪,结构标签确定 JSON 字段名称将是什么(即username&email用于每个帐户和accounts整个帐户数组)。


希望有帮助。如果您需要更具体的帮助,请发表评论。


查看完整回答
反对 回复 2022-06-13
?
largeQ

TA贡献2039条经验 获得超7个赞

您需要先解析 CSV 文件并将其转换为您想要的列表:


package main



func main() {

   file, err := os.Open("file.csv")

   if err != nil {

      log.Fatal("failed opening file because: %s", err.Error())

   }

   r := csv.NewReader(file)


   records, err := r.ReadAll()

   if err != nil {

      log.Fatal(err)

   }

   fmt.Print(records)

}

上面的代码将列表解析为 [][]string 数组。您现在需要遍历该数组并将其转换为页面所需的 json 对象。然后就可以发送了。您可以在此处阅读有关 csv 包的更多信息:https ://golang.org/pkg/encoding/csv/


一句忠告:永远不要忽略错误,它们可能会给你有用的信息。


查看完整回答
反对 回复 2022-06-13
  • 2 回答
  • 0 关注
  • 181 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信