Go語言是一種支持JSON數據的編程語言,可以使用內置的json包對JSON進行編碼和解碼。然而,有時候我們可能會面臨JSON數據不符合標準格式的情況。在這種情況下,go json包還提供了一些非標準的配置選項,讓我們能夠處理非標準的JSON數據。
比如說,如果JSON數據的鍵名沒有被引號包裹,我們可以使用以下代碼解碼該數據:
package main import ( "encoding/json" "fmt" ) func main() { data := `{ name: "Alice", age: 30 }` var person map[string]interface{} err := json.Unmarshal([]byte(data), &person) if err != nil { panic(err) } fmt.Println(person) }
輸出結果如下:
map[name:Alice age:30]
同樣地,如果JSON數據的值是NaN或Infinity,則需要使用非標準選項解碼,如下所示:
package main import ( "encoding/json" "fmt" "math" ) func main() { data := `[NaN, Infinity, -Infinity]` var numbers []float64 err := json.Unmarshal([]byte(data), &numbers) if err != nil { var fNaN, fInf, fNegInf float64 dec := json.NewDecoder(strings.NewReader(data)) dec.UseNumber() _, err := dec.Token() if err != nil { panic(err) } n, err := dec.Token() if err != nil { panic(err) } fNaN, err = n.(json.Number).Float64() n, err = dec.Token() if err != nil { panic(err) } if n == "Infinity" { fInf = math.Inf(1) } else if n == "-Infinity" { fNegInf = math.Inf(-1) } numbers = []float64{fNaN, fInf, fNegInf} } fmt.Println(numbers) }
輸出結果如下:
[NaN +Inf -Inf]
因此,go json包提供了豐富的選項讓我們能夠更好地處理非標準的JSON數據。
下一篇c json庫 源代碼