json.Unmarshal將打開的文件描述符從 os.Create() 傳遞到接受類型 io.Reader 并運(yùn)行 io.Copy(b.Bytes(), reader) 的函數(shù)后,有效 JSON 失敗下面代碼塊中的方法是否Read()正確實(shí)現(xiàn)?io.Reader包裝該Read方法,但會(huì)向其傳遞一個(gè)打開的文件描述符,將文件讀取為字節(jié),從而允許 io.Copy(b.Bytes(), reader) 將數(shù)據(jù)復(fù)制到 var b 中?有沒有更好的方法來做到這一點(diǎn)而不使用ioutil.ReadAll?已驗(yàn)證 JSON 完全有效。使用 jq 和 3 個(gè)在線 JSON 驗(yàn)證器進(jìn)行驗(yàn)證。驗(yàn)證數(shù)據(jù)實(shí)際上已通過另一個(gè)實(shí)現(xiàn) io.Write 的函數(shù)成功寫入文件。已驗(yàn)證ioutil.ReadAll可以將 JSON 讀取為字節(jié),因此我認(rèn)為所使用的方法實(shí)施不正確。** 這不是我的代碼,我正在對(duì)其他人編寫的代碼進(jìn)行故障排除,但其他人無法回答任何問題 **我有一個(gè) json 文件collected_data.json。該文件是使用 os.Create 創(chuàng)建的file, err := os.Create("/var/log/collected_data.json")配置了一個(gè)結(jié)構(gòu),將其設(shè)置file為DataStore:profiler := &collectors.SystemProfiler{ DataStore: file, NetworkInterfaces: interfaces, ApiURL: *apiURL, RunOnce: *runOnce, SysTag: *sysTag,}然后我們運(yùn)行一個(gè)Gather()方法。err = profiler.Send(output)if err != nil { log.Error(err)}該Send()方法實(shí)現(xiàn)了 SystemProfiler 結(jié)構(gòu):func (s *SystemProfiler) Send(profile *SystemProfile) error {...}到此為止,一切工作正常,直到我們嘗試從 讀取和解組數(shù)據(jù)的代碼部分/var/log/collected_data.json。在此Send()方法中,我們嘗試在兩種情況下讀取文件/var/log/collected_data.json。第一,如果文件不為空,我們讀取該文件,并用它做一些事情(此處未顯示)。data, err := store.Read(s.DataStore)if err != nil { log.Print("I couldn't read the datastore") return err}第二,如果文件不為空,我們將數(shù)據(jù)寫入文件,然后立即將其讀回并 Unmarshal 以滿足稍后在reflect.DeepEqual數(shù)據(jù)比較和寫入文件的數(shù)據(jù)之間進(jìn)行比較的函數(shù)。在這兩種情況下,該Read()方法都會(huì)返回“Unexpected end of JSON input”,并且文件中包含有效的 JSON /var/log/collected_data.json。用于寫入數(shù)據(jù)的方法工作得很好。{"level":"info","msg":"I couldn't read the datastore","time":"2019-08-02T02:26:42-04:00"}{"level":"error","msg":"unexpected end of JSON input","time":"2019-08-02T02:26:42-04:00"}該Read()方法如下所示:// Read reads JSON data from an io.Readerfunc Read(reader io.Reader) (interface{}, error) { var data interface{} var b bytes.Buffer io.Copy(&b, reader) err := json.Unmarshal(b.Bytes(), &data) if err != nil { return nil, err } return data, nil}預(yù)期成績:有效的 JSON 從 io.Reader 類型的 reader 復(fù)制到 bytes.Buffer 類型的 b,成功解組并返回。實(shí)際結(jié)果:{"level":"error","msg":"JSON 輸入意外結(jié)束","time":"2019-08-02T02:26:42-04:00"}
1 回答

暮色呼如
TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超9個(gè)贊
問題的答案是肯定的。An*os.File
可以用作io.Reader
.
問題在于應(yīng)用程序?qū)?shù)據(jù)寫入文件,然后嘗試從文件中讀取相同的數(shù)據(jù),而不查找數(shù)據(jù)寫入的位置。
通過在調(diào)用 store.Write 之后和調(diào)用 store.Read 之前添加以下代碼來解決此問題。
if _, err := s.DataStore.Seek(io.SeekStart, 0); err != nil { return err }
- 1 回答
- 0 關(guān)注
- 133 瀏覽
添加回答
舉報(bào)
0/150
提交
取消