Unmarshal json дюйм Go - PullRequest
       2

Unmarshal json дюйм Go

0 голосов
/ 18 июня 2020

У меня есть следующие json для работы:

jsonStr := `{"Ok":[true,{"amount_awaiting_confirmation":"0","amount_awaiting_finalization":"0","amount_currently_spendable":"0","amount_immature":"0","amount_locked":"0","last_confirmed_height":"551632","minimum_confirmations":"10","total":"0"}]}`

Вот как я справляюсь сейчас:

    resMap := make(map[string]interface{}, 0)
    json.Unmarshal([]byte(jsonStr), &resMap)
    if val, ok := resMap["Ok"]; ok {
        tup := val.([]interface{})
        wMap := tup[1].(map[string]interface{})

        amountAwaitingConfirmation, _ := strconv.ParseInt(wMap["amount_awaiting_confirmation"].(string), 10, 64)
        amountAwaitingFinalization, _ := strconv.ParseInt(wMap["amount_awaiting_finalization"].(string), 10, 64)
        amountCurrentSpendable, _ := strconv.ParseInt(wMap["amount_currently_spendable"].(string), 10, 64)
        amountImmature, _ := strconv.ParseInt(wMap["amount_immature"].(string), 10, 64)
        amountLocked, _ := strconv.ParseInt(wMap["amount_locked"].(string), 10, 64)
        lastConfirmedHeight, _ := strconv.ParseInt(wMap["last_confirmed_height"].(string), 10, 64)
        minimumConfirmations, _ := strconv.ParseInt(wMap["minimum_confirmations"].(string), 10, 64)
        total, _ := strconv.ParseInt(wMap["total"].(string), 10, 64)
    }

Есть ли более простой способ справиться эта структура без необходимости прибегать к обобщению c interface {}?

1 Ответ

1 голос
/ 18 июня 2020

Единственное, что вы можете сделать, чтобы избавиться от всех утверждений типов вручную, - это частично демаршалировать JSON с помощью json.RawMessage. Затем вы можете по крайней мере использовать структуру для демаршалинга объектной части списка.

Вот пример, использующий строку JSON, которую вы опубликовали (и здесь она работает в Go Playground ):

type OkJson struct {
    Ok []json.RawMessage
}

type Details struct {
    AmountAwaitingConfirmation string `json:"amount_awaiting_confirmation"`
    AmountAwaitingFinalization string `json:"amount_awaiting_finalization"`
    AmountCurrentlySpendable   string `json:"amount_currently_spendable"`
    AmountImmature             string `json:"amount_immature"`
    AmountLocked               string `json:"amount_locked"`
    LastConfirmedHeight        string `json:"last_confirmed_height"`
    MinimumConfirmations       string `json:"minimum_confirmations"`
    Total                      string `json:"total"`
}

func main() {
    var okj OkJson
    _ = json.Unmarshal([]byte(jsonStr), &okj)

    var aBool bool
    _ = json.Unmarshal(okj.Ok[0], &aBool)
    fmt.Println(aBool)

    var details Details
    _ = json.Unmarshal(okj.Ok[1], &details)
    fmt.Println(details)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...