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

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

檢查 JSON 是對象還是數組

檢查 JSON 是對象還是數組

Go
莫回無 2023-06-12 16:20:57
Go 中是否有一種簡單的方法來檢查給定的 JSON 是對象{}還是數組[]?首先想到的是json.Unmarshal()進入一個界面,然后看它是不是變成了一張地圖,或者是一片地圖。但這似乎效率很低。我可以只檢查第一個字節是 a{還是 a 嗎[?或者是否有更好的方法已經存在。
查看完整描述

3 回答

?
守著一只汪

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

使用以下代碼檢測值中的 JSON 文本[]byte是data數組還是對象:


 // Get slice of data with optional leading whitespace removed.

 // See RFC 7159, Section 2 for the definition of JSON whitespace.

 x := bytes.TrimLeft(data, " \t\r\n")


 isArray := len(x) > 0 && x[0] == '['

 isObject := len(x) > 0 && x[0] == '{'

這段代碼處理可選的前導空格,比解組整個值更有效。


因為 JSON 中的頂級值也可以是數字、字符串、布爾值或 nil,所以isArray和isObject都可能計算為 false。當 JSON 無效時,值isArray和也可以評估為 false。isObject


查看完整回答
反對 回復 2023-06-12
?
ibeautiful

TA貢獻1993條經驗 獲得超6個贊

使用類型開關來確定類型。這類似于 Xay 的回答,但更簡單:


var v interface{}

if err := json.Unmarshal(data, &v); err != nil {

    // handle error

}

switch v := v.(type) {

case []interface{}:

    // it's an array

case map[string]interface{}:

    // it's an object

default:

    // it's something else

}


查看完整回答
反對 回復 2023-06-12
?
大話西游666

TA貢獻1817條經驗 獲得超14個贊

使用json.Decoder.?這比其他答案有優勢:

  1. 比解碼整個值更有效

  2. 使用官方的 JSON 解析規則,如果輸入無效則生成標準錯誤。

請注意,此代碼未經測試,但應該足以讓您了解。如果需要,它還可以輕松擴展以檢查數字、布爾值或字符串。

func jsonType(in io.Reader) (string, error) {

? ? dec := json.NewDecoder(in)

? ? // Get just the first valid JSON token from input

? ? t, err := dec.Token()

? ? if err != nil {

? ? ? ? return "", err

? ? }

? ? if d, ok := t.(json.Delim); ok {

? ? ? ? // The first token is a delimiter, so this is an array or an object

? ? ? ? switch (d) {

? ? ? ? case '[':

? ? ? ? ? ? return "array", nil

? ? ? ? case '{':

? ? ? ? ? ? return "object", nil

? ? ? ? default: // ] or }, shouldn't be possible

? ? ? ? ? ? return "", errors.New("Unexpected delimiter")

? ? ? ? }

? ? }

? ? return "", errors.New("Input does not represent a JSON object or array")

}

請注意,這消耗了in. 如有必要,讀者可以復印一份。如果您嘗試從字節切片 ( ) 中讀取[]byte,請先將其轉換為讀取器:


t, err := jsonType(bytes.NewReader(myValue))


查看完整回答
反對 回復 2023-06-12
  • 3 回答
  • 0 關注
  • 207 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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