登录
首页 >  Golang >  Go问答

在 golang json.Unmarshal() 中,在 Playground/复制粘贴的 JSON 中有效,但在实际代码中无效

来源:stackoverflow

时间:2024-04-06 15:36:33 402浏览 收藏

学习Golang要努力,但是不要急!今天的这篇文章《在 golang json.Unmarshal() 中,在 Playground/复制粘贴的 JSON 中有效,但在实际代码中无效》将会介绍到等等知识点,如果你想深入学习Golang,可以关注我!我会持续更新相关文章的,希望对大家都能有所帮助!

问题内容

我正在用 golang 编写一个程序,该程序与赤足地图匹配库的修改版本交互,该库通过 netcat 以 json 形式返回结果。

我的实际代码中的 json.unmarshal 只会解析对结构体 nil 值的响应。但是,如果将 json 打印到控制台(请参阅下面的代码片段)并将其复制粘贴到 go 演示中,它将按预期运行。

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

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

这是相关的代码片段(结构与 go 演示相同)

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 ""
    }

}

解决方案


按照 cerise limón 正确处理错误消息的建议,我确定 json 中的 osm_id 值在从 io_func() 获取字符串时被 json.unmarshall 解析为数字,尽管当字符串被解析时它并没有这样做。在演示示例中手动传入。虽然我不明白为什么会这样,但我会通过适当的错误处理来发现它。

我修改了 barefoot 代码,以用引号显式返回 osm_id ,因为虽然只由数字组成,但我只将其用作字符串。现在它按预期工作。同样,我可以根据需要更改结构中的类型并在 go 中进行转换。

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(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 中包含换行符,则应用程序将读取部分消息。

今天带大家了解了的相关知识,希望对你有所帮助;关于Golang的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>