在golang json.Unmarshal()在操场/复制粘贴的json中起作用,但在实际代码中不起作用

问题描述 投票:0回答:1

[我正在用Golang编写一个程序,该程序与barefoot mapmatching库的修改版本接口,该库通过netcat在json中返回结果。

我在我的实际代码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 ""
    }

}
json go unmarshalling
1个回答
0
投票

io_func函数创建并丢弃bufio.Reader和读取器可能已缓冲的数据。如果应用程序调用io_func的次数大于应用程序的调用次数,则该应用程序可能会丢弃从网络读取的数据。通过在函数外部创建单个bufio.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(conn, r, cmd)
if err != nil {
    // handle error
}
var obvs []Json_out
json.Unmarshal([]byte(body), &obvs)
fmt.Println(body)
fmt.Println(obvs)

// read next 
body, err = io_func(conn, r, cmd)
if err != nil {
    // handle error
}
© www.soinside.com 2019 - 2024. All rights reserved.