[英]In golang json.Unmarshal() works in playground/copy pasted JSON but not in actual code
我正在用 Golang 編寫一個程序,該程序與修改版的赤腳地圖匹配庫接口,該庫通過 netcat 返回 json 的結果。
我在我的實際代碼中json.Unmarshal
只會解析對結構的 nil 值的響應。 但是,如果將 json 打印到控制台(請參閱下面的代碼片段)並將粘貼復制到 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 function 創建並丟棄 bufio.Reader 和讀取器可能緩沖的數據。 如果應用程序多次調用 io_func,則應用程序可能正在丟棄從網絡讀取的數據。 通過在 function 之外創建單個 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 中包含換行符,則應用程序將讀取部分消息。
按照 Cerise Limón 正確處理錯誤消息的建議,我確定 JSON 中的osm_id
值正在被json.Unmarshall
解析為從io_func()
獲取字符串時的數字,盡管在手動傳入字符串時它沒有這樣做游樂場的例子。 雖然我不明白為什么會這樣,但我會通過適當的錯誤處理來解決它。
我更改了赤腳代碼以用反逗號顯式返回osm_id
,因為盡管只由數字組成,但我只將其用作字符串。 它現在按預期工作。 同樣,我可以更改結構中的類型並根據需要在 Go 中進行轉換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.