Ошибка при печати выбранных полей после разбора JSON Object - PullRequest
0 голосов
/ 23 февраля 2020

Попытка разобрать объект JSON через Go, выполнить итерацию по записям и распечатать только выбранные поля. Возникла проблема с невозможностью ссылки во время печати с использованием fmt.

JSON Структура объекта:

type myBalanceInfo struct {
     Name     string                    `json:"name"`
     Id       int64                     `json:"id"`
     Balances map[string]myBalance      `json:"balances"`
}
type myBalance[]myBalanceInfo

type myBalance struct {
     Available decimal.Decimal          `json:"available"`
     Balance   decimal.Decimal          `json:"balance"`
 }

temp. json:

 {
"abc": {
    "name": "abc",
    "id": 1,
    "balances": {
        "acc1": {
            "available": "1.2",
            "balance": "1.2"
        },
        "acc2": {
            "available": "2.000001",
            "balance": "2.000001"
        },
        "acc3": {
            "available": "0.000001",
            "balance": "0.000001"
        },
        "acc4": {
            "available": "1000",
            "balance": "1000"
        }
    }
}

}

Main:

jsonInputFile := os.Open("temp.json")
defer jsonInputFile.Close()

jsonByteValue, _ := ioutil.ReadAll(jsonInputFile )
var data []myBalanceInfo
json.Unmarshal([]byte(jsonByteValue), &data )

for i := 0; i < (len(data)); i++ {
    fmt.Println("ID: " + strconv.FormatInt(data[i].Id, 10))
    fmt.Println("Balance: " + decimal.NewFromString(data[i].Balance))
}

Ошибка:

Недопустимая операция: «Баланс:» + walletData [i]. Баланс (несоответствие типов строки и десятичного. Десятичное) »

1 Ответ

0 голосов
/ 23 февраля 2020

Замените эту строку

fmt.Println("Balance: " + decimal.NewFromString(data[i].Balance))

на

fmt.Println("Balance: " , data[i].Balance)

Потому что,

func NewFromString(value string) (Decimal, error)

Возьмите строку в качестве аргумента и верните Decimal с error. В то время как значение, которое вы передаете, уже является Decimal.

Еще одна вещь, знак "+" в

fmt.Println("Balance: " + decimal.NewFromString(data[i].Balance))

Предположим, что значение, возвращаемое decimal.NewFromString(data[i].Balance), будет строкой, которой нет. вот почему вы получаете сообщение об ошибке.

Недопустимая операция: "Balance:" + walletData [i] .Balance (несоответствие типов строки и десятичного. Десятичное) "

...