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

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

哪個(gè)是處理大 json 和替換特定值的最佳方法?

哪個(gè)是處理大 json 和替換特定值的最佳方法?

Go
SMILET 2021-11-01 17:17:37
我有一個(gè)很大的 json (30mb),其中包含不同對(duì)象中的“標(biāo)題”字段,json 的結(jié)構(gòu)未知。只知道 json 包含鍵“title”,這個(gè)鍵的字符串值必須轉(zhuǎn)換成另一個(gè)。{    "data1" : {        "title" : "alpha",        "color" : "green"    },    "data2" : {        "someInnerData1" : {            "title" : "beta"            "color" : "red"        },        "someInnerData2" : {            "someArray" : [            {                "title" : "gamme",                "color" : "orange"            },            {                "title" : "delta",                "color" : "purple"            }            ],            "title" : "epsilon"        }    }}替換示例“alpha”->“Α”“beta”->“B”等。在 Golang 中實(shí)現(xiàn)這一目標(biāo)的最佳方法是什么,而無需解碼為 struct ?PS Json 從網(wǎng)絡(luò)接收。
查看完整描述

2 回答

?
人到中年有點(diǎn)甜

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超7個(gè)贊

我會(huì)創(chuàng)建一個(gè)實(shí)現(xiàn)io.Reader接口的結(jié)構(gòu),并使用該讀取器作為翻譯基礎(chǔ):您可以使用它來逐塊獲取 JSON 輸入,并檢測(cè)您何時(shí)使用需要更改的鍵,因此將其翻譯蒼蠅。

然后,您只需使用 aio.Copy將整個(gè)文件讀入另一個(gè)文件。

有關(guān)示例,請(qǐng)參閱text.transform包依賴關(guān)系圖...


查看完整回答
反對(duì) 回復(fù) 2021-11-01
?
POPMUISE

TA貢獻(xiàn)1765條經(jīng)驗(yàn) 獲得超5個(gè)贊

您可以使用像megajson這樣的流式 JSON 解碼器:


// Transform 'title' strings into Title case

func TitleizeJSON(r io.Reader, w io.Writer) error {

    buf := new(bytes.Buffer)

    r = io.TeeReader(r, buf)


    s := scanner.NewScanner(r)

    var prevTok int

    var prevPos int

    wasTitle := false

    titleField := []byte("title")

    for {

        // read the next json token

        tok, data, err := s.Scan()

        if err == io.EOF {

            return nil

        } else if err != nil {

            return err

        }

        // calculate the position in the buffer

        pos := s.Pos()

        off := pos - prevPos


        switch tok {

        // if this is a string

        case scanner.TSTRING:

            // if the previous string before a : was 'title', then

            // titlelize it

            if prevTok == scanner.TCOLON && wasTitle {

                // grab the first part of the buffer and skip

                // the first ", the titleize the rest

                data = buf.Bytes()[:off][1:]

                copy(data, bytes.Title(data))

                wasTitle = false

            } else {

                wasTitle = bytes.Equal(data, titleField)

            }

        }


        // now send the data to the writer

        data = buf.Bytes()

        _, err = w.Write(data[:off])

        if err != nil {

            return err

        }


        // reset the buffer (so it doesn't grow forever)

        nbuf := make([]byte, len(data)-off)

        copy(nbuf, data[off:])

        buf.Reset()

        buf.Write(nbuf)


        // for the next go-around

        prevTok = tok

        prevPos = pos

    }

}

這應(yīng)該可以即時(shí)進(jìn)行標(biāo)題化。我能想到的一個(gè)問題是,如果你有一個(gè)非常大的字符串。


查看完整回答
反對(duì) 回復(fù) 2021-11-01
  • 2 回答
  • 0 關(guān)注
  • 215 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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