3 回答

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超10個(gè)贊
將開頭寫入[文件。在文件上創(chuàng)建一個(gè)編碼器。遍歷切片和每個(gè)切片的元素。如果它不是第一個(gè)切片元素,請(qǐng)寫一個(gè)逗號(hào)。使用編碼器對(duì)每個(gè)切片元素進(jìn)行編碼。寫結(jié)尾]。
_, err := f.WriteString("[")
if err != nil {
log.Fatal(err)
}
e := json.NewEncoder(f)
first := true
for i := 0; i < 10; i++ {
// Create dummy slice data for this iteration.
dataToWrite := []struct {
Id string
Data string
}{
{fmt.Sprintf("id%d.1", i), fmt.Sprintf("data%d.1", i)},
{fmt.Sprintf("id%d.2", i), fmt.Sprintf("data%d.2", i)},
}
// Encode each slice element to the file
for _, v := range dataToWrite {
// Write comma separator if not the first.
if !first {
_, err := f.WriteString(",\n")
if err != nil {
log.Fatal(err)
}
}
first = false
err := e.Encode(v)
if err != nil {
log.Fatal(err)
}
}
}
_, err = f.WriteString("]")
if err != nil {
log.Fatal(err)
}
https://go.dev/play/p/Z-T1nxRIaqL
如果將所有 slice 元素保存在內(nèi)存中是合理的,則通過在單個(gè)批次中對(duì)所有數(shù)據(jù)進(jìn)行編碼來簡(jiǎn)化代碼:
type Item struct {
Id string
Data string
}
// Collect all items to write in this slice.
var result []Item
for i := 0; i < 10; i++ {
// Generate slice for this iteration.
dataToWrite := []Item{
{fmt.Sprintf("id%d.1", i), fmt.Sprintf("data%d.1", i)},
{fmt.Sprintf("id%d.2", i), fmt.Sprintf("data%d.2", i)},
}
// Append slice generated in this iteration to the result.
result = append(result, dataToWrite...)
}
// Write the result to the file.
err := json.NewEncoder(f).Encode(result)
if err != nil {
log.Fatal(err)
}
https://go.dev/play/p/01xmVZg7ePc

TA貢獻(xiàn)1845條經(jīng)驗(yàn) 獲得超8個(gè)贊
如果您不關(guān)心現(xiàn)有文件,您可以Encoder.Encode
像@redblue 提到的那樣在整個(gè)切片上使用。
如果您有一個(gè)要附加到的現(xiàn)有文件,最簡(jiǎn)單的方法是執(zhí)行您在編輯中顯示的內(nèi)容:Unmarshal
或Decoder.Decoder
將整個(gè)文件放入一個(gè)結(jié)構(gòu)片中,將新結(jié)構(gòu)附加到該片中,然后重新解碼大量使用Marshal
or Encoder.Encode
。
如果你有大量的數(shù)據(jù),你可能要考慮使用JSON Lines來避免拖尾,
和]
問題,并且每行寫一個(gè) JSON 對(duì)象?;蛘?,您可以使用常規(guī) JSON,從文件末尾向后查找,這樣您就可以覆蓋 final ]
,然后編寫一個(gè),
,新的 JSON 編碼結(jié)構(gòu),最后編寫一個(gè),]
使文件再次成為有效的 JSON 數(shù)組。
因此,這在一定程度上取決于您的用例和您采用哪種方法的數(shù)據(jù)大小。

TA貢獻(xiàn)1848條經(jīng)驗(yàn) 獲得超10個(gè)贊
注意
這個(gè)答案是一個(gè)solution或者workaround如果你關(guān)心現(xiàn)有文件的內(nèi)容!
這意味著它允許您附加到existing json由您創(chuàng)建的文件API。
顯然這只適用于相同結(jié)構(gòu)的數(shù)組
實(shí)際工作的 json 格式:
[
object,
...
object,
]
寫入文件時(shí),不要寫[and ]。只需附加到寫入序列化json對(duì)象的文件并附加一個(gè),
實(shí)際文件內(nèi)容:
object,
...
object,
最后在讀取文件時(shí)[添加和追加]
這樣你就可以write從多個(gè)來源訪問文件并且仍然有效JSON
還要加載文件并為您的處理器提供有效輸入json。
我們像這樣編寫日志文件并json通過REST調(diào)用提供一個(gè) vaild,然后對(duì)其進(jìn)行處理(例如通過 a JavaScript Grid)
- 3 回答
- 0 關(guān)注
- 174 瀏覽
添加回答
舉報(bào)