Строгий json parser в golang - программирование

Строгий json parser в golang

В Go у меня есть JSON от стороннего API, а затем я пытаюсь его разобрать:

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)

Есть ли способ прочитать первую версию JSON от стороннего API?

4b9b3361

Ответ 1

Go - строго типизированный язык. Вам нужно указать, какие типы должен ожидать кодер JSON. Вы создаете карту строковых значений, но ваши два значения 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)
}

Если вы хотите сделать это более динамично, вы можете использовать карту значений интерфейса {}. Вам просто нужно делать утверждения типа, когда вы используете значения.

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 an int.
    fmt.Printf("Age: %1.0f\n", u["age"].(float64))
    fmt.Printf("Married: %v\n", u["married"].(bool))
}