gpt4 book ai didi

json - 解码 JSON 时出错

转载 作者:IT王子 更新时间:2023-10-29 02:29:44 28 4
gpt4 key购买 nike

在过去的几天里,我第一次尝试使用 GO。

我有一个 HTML 表单,可以将它的值传递给服务器。该服务器依次提取表单键/值并将它们放入 JSON 中。然后将此 JSON 发送到另一台服务器。

问题是:当第二台服务器尝试解码 JSON 时出现以下错误:

JSON 解码错误:json:无法将字符串解码为 main.NewContainerJSON 类型的 Go 值

1:原始的HTML表单

<form method="post" action="http://127.0.0.1:8080/new-user" autocomplete ="on">
<table>
<tr>
<td colspan="2"><h1>Container Configuration</h1></td>
</tr>
<tr>
<td><h2>Container Name</h2></td>
<td><input type="text" name="containerName" placeholder = "My Container Name" required /></td>
</tr>
<tr>
<td><h2>Base Server</h2></td>
<td>
<select name="BaseServer">
<option value="Ubuntu 14.04">Ubuntu 14.04</option>
</td>
</tr>
<tr>
<td><h2>Content Management System</h2></td>
<td>
<select name="CMS">
<option value="Wordpress">Wordpress</option>
</td>
</tr>
<tr>
<td><h2>Website Name</h2></td>
<td><input type="text" name="websiteName" placeholder = "mysite.com" required /></td>
</tr>
<tr>
<td><h2>New Root Database Password</h2> </td>
<td><input type = "password" name = "dbRootPWD" placeholder = "password" required /></td>
</tr>
<tr>
<td><h2>Database Admin Username</h2></td>
<td><input type = "text" name = "dbAdminUname" placeholder = "Admin" required /></td>
</tr>
<tr>
<td><h2>Database Admin Password</h2></td>
<td><input type = "password" name = "dbAdminPwd" placeholder = "password" required /></td>
</tr>
<tr>
<td></td>
<td><input type = "submit" value = "submit"></td>
</tr>
</table>

2:第一个服务器代码

package main

import (
"fmt"
"encoding/json"
"net"
"net/http"
)

type newContainerJSON struct {
ContainerName string
BaseServer string
CMS string
WebsiteName string
DBrootPWD string
DBadminUname string
DBadminPWD string
}

func newUser(w http.ResponseWriter, r *http.Request) {
r.ParseForm()

cName := r.FormValue("containerName")
sName := r.FormValue("BaseServer")
cmsName := r.FormValue("CMS")
wsName := r.FormValue("websiteName")
dbrootPwd := r.FormValue("dbRootPWD")
dbadmName := r.FormValue("dbAdminUname")
dbamdpwdName := r.FormValue("dbAdminPwd")

c := newContainerJSON {
ContainerName: cName,
BaseServer: sName,
CMS: cmsName,
WebsiteName: wsName,
DBrootPWD: dbrootPwd,
DBadminUname: dbadmName,
DBadminPWD: dbamdpwdName,
}

d, _ := json.Marshal(c)
s := string(d)
fmt.Println(s)

conn, err := net.Dial("tcp", "127.0.0.1:8081")
checkError(err)

encoder := json.NewEncoder(conn)

encoder.Encode(d)
}

func main() {
http.HandleFunc("/new-user", newUser)
err := http.ListenAndServe(":8080", nil) // setting listening port
checkError(err)
}

func checkError(err error) {
if err != nil {
fmt.Println("Fatal error ", err.Error())
}
}

3:第二台服务器代码:

package main

import (
"fmt"
"net"
"encoding/json"
)

type NewContainerJSON struct {
ContainerName string `json:",string"`
BaseServer string `json:",string"`
CMS string `json:",string"`
WebsiteName string `json:",string"`
DBrootPWD string `json:",string"`
DBadminUname string `json:",string"`
DBadminPWD string `json:",string"`
}

func main() {

service := "127.0.0.1:8081"
tcpAddr, err := net.ResolveTCPAddr("tcp", service)
checkError(err)

listener, err := net.ListenTCP("tcp", tcpAddr)
checkError(err)

conn, err := listener.Accept()
checkError(err)

decoder := json.NewDecoder(conn)

var b NewContainerJSON
err = decoder.Decode(&b)
checkError(err)

fmt.Println(b)

conn.Close() // we're finished

}

func checkError(err error) {
if err != nil {
fmt.Println("An error occurred: ", err.Error())

}
}

错误发生在第二个服务器代码中的以下代码

var b NewContainerJSON
err = decoder.Decode(&b)
checkError(err)

fmt.Println(b)

我怀疑我没有正确解码 JSON 或者我遗漏了一些非常明显的东西。

最佳答案

第一台服务器对值进行双重编码。结果是一个字符串。

d, _ := json.Marshal(c) // d is []byte containing the JSON
...
encoder.Encode(d) // encoder writes base64 encoding of []byte as JSON string

将代码更改为:

conn, err := net.Dial("tcp", "127.0.0.1:8081")
if err != nil {
// handle error
}
encoder := json.NewEncoder(conn)
if err := encoder.Encode(c); err != nil {
// handle error
}

关于json - 解码 JSON 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36322527/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com