Golang Json для однозначного анализа

В python вы можете взять объект json и извлечь из него определенный элемент, не объявляя структуру, сохраняя ее в структуре, а затем получая значение, как в Go. Есть ли пакет или более простой способ сохранить определенное значение из json в Go?

питон

res = res.json()
return res['results'][0] 

Идти

type Quotes struct {
AskPrice string `json:"ask_price"`
}

quote := new(Quotes)
errJson := json.Unmarshal(content, &quote)
if errJson != nil {
    return "nil", fmt.Errorf("cannot read json body: %v", errJson)
}

2 ответа

Решение

Вы можете декодировать в map[string]interface{} а затем получить элемент по ключу.

data := make(map[string]interface{})
err := json.Unmarshal(content, &data)
if err != nil {
    return nil, err
}

price, ok := data["ask_price"].(string); !ok {
    // ask_price is not a string
    return nil, errors.New("wrong type")
}

// Use price as you wish

Структуры часто предпочтительнее, так как они более явные в отношении типа. Вам нужно только объявить поля в JSON, о котором вы заботитесь, и вам не нужно вводить значения, как если бы это было с картой (encoding/json обрабатывает это неявно).

Попробуйте либо fastjson, либо jsonparser. jsonparser оптимизирован для случая, когда необходимо выбрать одно поле JSON, в то время как fastjson оптимизирован для случая, когда необходимо выбрать несколько несвязанных полей JSON.

Ниже приведен пример кода для fastjson:

var p fastjson.Parser
v, err := p.Parse(content)
if err != nil {
    log.Fatal(err)
}

// obtain v["ask_price"] as float64
price := v.GetFloat64("ask_price")

// obtain v["results"][0] as generic JSON value
result0 := v.Get("results", "0")
Другие вопросы по тегам