亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

映射到 JSON,但保留鍵順序

映射到 JSON,但保留鍵順序

Go
料青山看我應如是 2022-10-24 15:38:54
我有一個地圖對象,當使用json.Marshal(myMapObjct)Golang 對其進行序列化時,它會按字母順序對鍵進行排序,這會導致數據處理方式出現問題。將 JSON 結構創建為字節切片后,保留鍵順序很重要。是否可以以這種方式對其進行序列化,或者我是否需要為這種特定的邊緣情況編寫自己的序列化程序?這是負責生成 JSON 結構的代碼片段:// serializedTraffic wraps around naturalTraffic and serializes map to string.func serializedTraffic(payload string) (string, error) {    trafficMap := naturalTraffic(string(payload))    traffic, err := json.Marshal(trafficMap)    return string(traffic), err}    // naturalTraffic obfuscates 'payload' into JSON-like structure.func naturalTraffic(payload string) map[string]string {    // Decide on how many keys there will be in the JSON structure.    indexChar := 0    maxChars := 126    minChars := 16    var jsonObject = make(map[string]string)    // Build the JSON structure.    for indexChar < len(payload) {        rand.Seed(time.Now().UnixNano())        chunkSize := rand.Intn(maxChars-minChars) + minChars        if len(payload) < indexChar+chunkSize {            chunkSize = len(payload) - indexChar        }        key := randomPopularWord()        jsonObject[key] = base64.StdEncoding.EncodeToString([]byte(payload[indexChar : indexChar+chunkSize]))        indexChar += chunkSize    }    return jsonObject}
查看完整描述

1 回答

?
繁花不似錦

TA貢獻1851條經驗 獲得超4個贊

根據建議,我提供了一種不同的結構來修復代碼。


    type elem struct{ key, val string }


    type object []elem


    func (o object) MarshalJSON() (out []byte, err error) {

        if o == nil {

            return []byte(`null`), nil

        }

        if len(o) == 0 {

            return []byte(`{}`), nil

        }


        out = append(out, '{')

        for _, e := range o {

            key, err := json.Marshal(e.key)

            if err != nil {

                return nil, err

            }

            val, err := json.Marshal(e.val)

            if err != nil {

                return nil, err

            }

            out = append(out, key...)

            out = append(out, ':')

            out = append(out, val...)

            out = append(out, ',')

        }

        // replace last ',' with '}'

        out[len(out)-1] = '}'

        return out, nil

    }


    // serializedTraffic wraps around naturalTraffic and serializes map to string.

    func serializedTraffic(payload string) (string, error) {

        trafficMap := naturalTraffic(string(payload))

        traffic, err := trafficMap.MarshalJSON()

        return string(traffic), err

    }


    // naturalTraffic obfuscates 'payload' into JSON-like structure.

    func naturalTraffic(payload string) object {

        // Decide on how many keys there will be in the JSON structure.

        indexChar := 0

        maxChars := 126

        minChars := 16


        var jsonObject object


        // Build the JSON structure.

        for indexChar < len(payload) {

            rand.Seed(time.Now().UnixNano())

            chunkSize := rand.Intn(maxChars-minChars) + minChars

            if len(payload) < indexChar+chunkSize {

                chunkSize = len(payload) - indexChar

            }

            key := randomPopularWord()

            jsonObject = append(jsonObject, elem{

                key: key,

                val: base64.StdEncoding.EncodeToString([]byte(payload[indexChar : indexChar+chunkSize])),

            })

            indexChar += chunkSize

        }


        return jsonObject

    }


查看完整回答
反對 回復 2022-10-24
  • 1 回答
  • 0 關注
  • 213 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號