第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何連續(xù)附加到 Go 中的 JSON 文件?

如何連續(xù)附加到 Go 中的 JSON 文件?

Go
慕姐4208626 2022-12-19 14:12:01
我想知道如何在 Go 中連續(xù)寫入同一個(gè)文件?我必須使用os.WriteAt()嗎?JSON 基本上只是一個(gè)充滿結(jié)構(gòu)的數(shù)組:[    {        "Id": "2817293",        "Data": "XXXXXXX"    },    {        "Id": "2817438",        "Data": "XXXXXXX"    }    ...]我想要連續(xù)向它添加正確的數(shù)據(jù),即在關(guān)閉文件之前多次附加到該 JSON 數(shù)組。我要寫入文件的數(shù)據(jù)是所述結(jié)構(gòu)的一部分:dataToWrite := []struct{    Id   string    Data string}{}在 Go 中連續(xù)寫入 JSON 數(shù)組的正確方法是什么?我當(dāng)前的方法在 JSON 文件中創(chuàng)建多個(gè)切片,因此不是我想要的。寫入過程(位于 for 循環(huán)中)如下所示:...            // Read current state of file            data := []byte{}            f.Read(data)            // Write current state to slice            curr := []Result{}            json.Unmarshal(data, &curr)            // Append data to the created slice            curr = append(curr, *initArr...)            JSON, _ := JSONMarshal(curr)            // Empty data container            initArr = &[]Result{}            // Write            _, err := f.Write(JSON)            if err != nil {                log.Fatal(err)            }...
查看完整描述

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


查看完整回答
反對(duì) 回復(fù) 2022-12-19
?
精慕HU

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)容:UnmarshalDecoder.Decoder將整個(gè)文件放入一個(gè)結(jié)構(gòu)片中,將新結(jié)構(gòu)附加到該片中,然后重新解碼大量使用Marshalor Encoder.Encode。

如果你有大量的數(shù)據(jù),你可能要考慮使用JSON Lines來避免拖尾,]問題,并且每行寫一個(gè) JSON 對(duì)象?;蛘?,您可以使用常規(guī) JSON,從文件末尾向后查找,這樣您就可以覆蓋 final ],然后編寫一個(gè),,新的 JSON 編碼結(jié)構(gòu),最后編寫一個(gè),]使文件再次成為有效的 JSON 數(shù)組。

因此,這在一定程度上取決于您的用例和您采用哪種方法的數(shù)據(jù)大小。


查看完整回答
反對(duì) 回復(fù) 2022-12-19
?
慕桂英546537

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)


查看完整回答
反對(duì) 回復(fù) 2022-12-19
  • 3 回答
  • 0 關(guān)注
  • 174 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)