在 golang json.Unmarshal() 中工作在 playground/copy 粘贴 JSON 但不是在实际代码中

In golang json.Unmarshal() works in playground/copy pasted JSON but not in actual code

我正在用 Golang 编写一个程序,该程序与 barefoot 地图匹配库的修改版本接口,returns 通过 netcat 结果 json。

My 在我的实际代码中 json.Unmarshal 只会解析对结构的 nil 值的响应。但是如果将 json 打印到控制台(请参阅下面的代码片段)并且 copy paste into goplayground 它会按预期运行。

我想知道这是否是我从控制台复制粘贴时绕过的编码问题。

如何让我的代码处理从赤脚收到的字符串和从控制台复制粘贴的字符串相同的字符串?

这是相关的代码片段(结构与 goplayground 相同)

body := io_func(conn, cmd)
    var obvs []Json_out
    json.Unmarshal([]byte(body), &obvs)
    fmt.Println(body)
    fmt.Println(obvs)

io_func() 如果相关(响应是两行,第一行是一条消息,第二行是 json 字符串)

func io_func(conn net.Conn, cmd string) string {
    fmt.Fprintf(conn, cmd+"\n")
    r := bufio.NewReader(conn)
    header, _ := r.ReadString('\n')
    if header == "SUCCESS\n" {
        resp, _ := r.ReadString('\n')
    return resp
    } else {
        return ""
    }

}

io_func 函数创建并丢弃 bufio.Reader 和 reader 可能缓冲的数据。如果应用程序多次调用 io_func,则应用程序可能会丢弃从网络读取的数据。通过在函数外部创建单个 bufio.Reader 并将该单个 reader 传递给 io_func.

的每次调用来修复

经常检查和处理错误。从这些函数中的任何一个返回的错误可能会为您指出正确的修复方向。

func io_func(r *bufio.Reader, conn net.Conn, cmd string) (string, error) {
    fmt.Fprintf(conn, cmd+"\n")
    header, err := r.ReadString('\n')
    if err != nil {
        return "", err
    }
    if header == "SUCCESS\n" {
        return r.ReadString('\n')
    }
    return "", nil
}


...

r := bufio.NewReader(conn)

body, err := io_func(r, conn, cmd)
if err != nil {
    // handle error
}
var obvs []Json_out
err = json.Unmarshal([]byte(body), &obvs)
if err != nil {
    // handle error
}
fmt.Println(body)
fmt.Println(obvs)

// read next 
body, err = io_func(r, conn, cmd)
if err != nil {
    // handle error
}

应用程序使用换行符来终止 JSON 正文,但换行符是 JSON 中的有效空格。如果对等方在 JSON 中包含换行符,则应用程序将读取部分消息。

按照 Cerise Limón 正确处理错误消息的建议,我确定 JSON 中的 osm_id 值在从 [=12= 中获取字符串时被 json.Unmarshall 解析为数字],尽管在 playground 示例中手动传入字符串时并没有这样做。虽然我不明白为什么会这样,但我会通过适当的错误处理来选择它。

我将赤脚代码更改为 return osm_id 明确地用倒逗号表示,因为虽然只由数字组成,但我只将它用作字符串。它现在按预期工作。同样,我可以根据需要更改结构中的类型并在 Go 中进行转换。