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

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

在不解組的情況下檢查 json 數組長度

在不解組的情況下檢查 json 數組長度

Go
慕哥9229398 2022-10-24 15:29:47
我有一個請求主體,它是一個 json 對象數組,例如,    {        "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"            }        ]    }我想獲取數組中對象的計數并將它們拆分為單獨的 json 輸出以傳遞給下一個服務。我通過解組原始 json 請求正文然后循環遍歷重新編組每個元素并將其附加到正在發送的任何傳出消息來執行此操作。就像是,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}我看到的是前后的字節數組是不同的,即使字符串表示是相同的。我想知道是否有一種方法可以做到這一點而不改變編碼或這里發生的任何事情來改變字節以防止任何不需要的突變?數組中的實際 json 對象都將具有不同的形狀,因此我無法使用帶有字段驗證的結構化 json 定義來提供幫助。此外,上面的代碼只是發生了什么的一個例子,所以如果有拼寫或語法錯誤,請忽略它們,因為實際代碼如所描述的那樣工作。
查看完整描述

1 回答

?
犯罪嫌疑人X

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

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

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

所以只需這樣做:

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

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

壓縮甚至可能是一個好主意,因為從原始上下文(對象和數組)中取出原始縮進可能看起來很奇怪,而且它會更短。要簡單地壓縮 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

}

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


for _, input := range inputs.Foo {

    buf := &bytes.Buffer{}

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

        panic(err)

    }

    fmt.Println(buf)

}

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


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上的示例。

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

它可能看起來像這樣:

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)

}


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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