15

Goでは、サードパーティのAPIからのJSONがいくつかあり、それを解析しようとしています。

b := []byte(`{"age":21,"married":true}`)
var response_hash map[string]string
_ = json.Unmarshal(b, &response_hash)

しかし、失敗し(response_hash空になり)、Unmarshal引用符付きのJSONのみを処理できます。

b := []byte(`{"age":"21","married":"true"}`)
var response_hash map[string]string
_ = json.Unmarshal(b, &response_hash)

サードパーティのAPIからJSONの最初のバージョンを読み取る方法はありますか?

4

1 に答える 1

23

Goは強く型付けされた言語です。JSONエンコーダーが期待するタイプを指定する必要があります。文字列値のマップを作成していますが、2つのjson値は整数値とブール値です。

これは、構造体を使用した実際の例です。

http://play.golang.org/p/oI1JD1UUhu

package main

import (
    "fmt"
    "encoding/json"
    )

type user struct {
    Age int
    Married bool
}

func main() {
    src_json := []byte(`{"age":21,"married":true}`)
    u := user{}
    err := json.Unmarshal(src_json, &u)
    if err != nil {
        panic(err)
    }
    fmt.Printf("Age: %d\n", u.Age)
    fmt.Printf("Married: %v\n", u.Married)
}

より動的な方法でそれを行いたい場合は、interface{}値のマップを使用できます。値を使用するときは、型アサーションを実行する必要があります。

http://play.golang.org/p/zmT3sPimZC

package main

import (
    "fmt"
    "encoding/json"
    )

func main() {
    src_json := []byte(`{"age":21,"married":true}`)
    // Map of interfaces can receive any value types
    u := map[string]interface{}{}
    err := json.Unmarshal(src_json, &u)
    if err != nil {
        panic(err)
    }
    // Type assert values
    // Unmarshal stores "age" as a float even though it's an int.
    fmt.Printf("Age: %1.0f\n", u["age"].(float64))
    fmt.Printf("Married: %v\n", u["married"].(bool))
}
于 2012-12-18T17:35:33.940 に答える