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

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

在不解組的情況下檢查 json 數(shù)組長度

在不解組的情況下檢查 json 數(shù)組長度

Go
慕哥9229398 2022-10-24 15:29:47
我有一個請求主體,它是一個 json 對象數(shù)組,例如,    {        "data": [            {                "id": "1234",                "someNestedObject": {                    "someBool": true,                    "randomNumber": 488                },                "timestamp": "2021-12-13T02:43:44.155Z"            },            {                "id": "4321",                "someNestedObject": {                    "someBool": false,                    "randomNumber": 484                },                "timestamp": "2018-11-13T02:43:44.155Z"            }        ]    }我想獲取數(shù)組中對象的計數(shù)并將它們拆分為單獨(dú)的 json 輸出以傳遞給下一個服務(wù)。我通過解組原始 json 請求正文然后循環(huán)遍歷重新編組每個元素并將其附加到正在發(fā)送的任何傳出消息來執(zhí)行此操作。就像是,requestBodyBytes := []bytes(JSON_INPUT_STRING)type body struct {    Foo []json.RawMessage `json:"foo"`}var inputs body_ = json.Unmarshal(requestBodyBytes, &inputs)for input := range inputs {    re, _ := json.Marshal(m)    ... do something with re}我看到的是前后的字節(jié)數(shù)組是不同的,即使字符串表示是相同的。我想知道是否有一種方法可以做到這一點(diǎn)而不改變編碼或這里發(fā)生的任何事情來改變字節(jié)以防止任何不需要的突變?數(shù)組中的實(shí)際 json 對象都將具有不同的形狀,因此我無法使用帶有字段驗證的結(jié)構(gòu)化 json 定義來提供幫助。此外,上面的代碼只是發(fā)生了什么的一個例子,所以如果有拼寫或語法錯誤,請忽略它們,因為實(shí)際代碼如所描述的那樣工作。
查看完整描述

1 回答

?
犯罪嫌疑人X

TA貢獻(xiàn)2080條經(jīng)驗 獲得超4個贊

如果使用json.RawMessage,JSON 源文本將不會被解析,而是按原樣存儲在其中(它是 a []byte)。

因此,如果您想分發(fā)相同的 JSON 數(shù)組元素,則無需對其進(jìn)行任何操作,您可以按原樣“移交”它。您不必將其傳遞給json.Marshal(),它已經(jīng)是 JSON 編組文本。

所以只需這樣做:

for _, input := range inputs.Foo {
    // input is of type json.RawMessage, and it's already JSON text
    }

如果您將 a 傳遞json.RawMessagejson.Marshal(),它可能會被重新編碼,例如壓縮(這可能會導(dǎo)致不同的字節(jié)序列,但它會保存與 JSON 相同的數(shù)據(jù))。

壓縮甚至可能是一個好主意,因為從原始上下文(對象和數(shù)組)中取出原始縮進(jìn)可能看起來很奇怪,而且它會更短。要簡單地壓縮 JSON 文本,您可以json.Compact()這樣使用:

for _, input := range inputs.Foo {

    buf := &bytes.Buffer{}

    if err := json.Compact(buf, input); err != nil {

        panic(err)

    }

    fmt.Println(buf) // The compacted array element value

}

如果您不想壓縮它,而是自己縮進(jìn)數(shù)組元素,請json.Indent()像這樣使用:


for _, input := range inputs.Foo {

    buf := &bytes.Buffer{}

    if err := json.Indent(buf, input, "", "  "); err != nil {

        panic(err)

    }

    fmt.Println(buf)

}

使用您的示例輸入,這是第一個數(shù)組元素的樣子(原始、壓縮和縮進(jìn)):


Orignal:

{

            "id": "1234",

            "someNestedObject": {

                "someBool": true,

                "randomNumber": 488

            },

            "timestamp": "2021-12-13T02:43:44.155Z"

        }


Compacted:

{"id":"1234","someNestedObject":{"someBool":true,"randomNumber":488},"timestamp":"2021-12-13T02:43:44.155Z"}


Indented:

{

  "id": "1234",

  "someNestedObject": {

    "someBool": true,

    "randomNumber": 488

  },

  "timestamp": "2021-12-13T02:43:44.155Z"

}

試試Go Playground上的示例。

另請注意,如果您決定壓縮或縮進(jìn)循環(huán)中的單個數(shù)組元素,您可以bytes.Buffer在循環(huán)之前創(chuàng)建一個簡單的,并在每次迭代中重用它,調(diào)用它的Buffer.Reset()方法來清除前一個數(shù)組的數(shù)據(jù)。

它可能看起來像這樣:

buf := &bytes.Buffer{}

for _, input := range inputs.Foo {

    buf.Reset()

    if err := json.Compact(buf, input); err != nil {

        panic(err)

    }

    fmt.Println("Compacted:\n", buf)

}


查看完整回答
反對 回復(fù) 2022-10-24
  • 1 回答
  • 0 關(guān)注
  • 132 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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