Десериализация чисел JSON, возвращающих неверные значения - PullRequest
0 голосов
/ 26 июня 2019

Я хочу десериализовать json strings с языком go. Типы значений разных ключей различны. например, , в string {\"category\":\"6\",\"cid\":2511993760745787586}category тип равен string, cid тип равен int64.

мой код выглядит следующим образом:

func main() {
    oriInfo := make([]interface{}, 0)
    pickled := "[{\"category\":\"6\",\"cid\":2511993760745787586},{\"category\":\"5\",\"cid\":2504429915944783937}]"
    err := json.Unmarshal([]byte(pickled), &oriInfo)
    if err != nil {
        fmt.Println(err)
        return
    }
    all := make([]map[string]interface{}, 0, len(oriInfo))
    for _, val := range oriInfo {
        m := make(map[string]interface{})
        for k, v := range val.(map[string]interface{}) {
            switch k {
            case "category":
                m[k] = v.(string)
            case "cid":
                m[k] = int64(v.(float64))
            }
        }
        all = append(all, m)
    }
    fmt.Println(all)
}

Результаты следующие:
[map[category:6 cid:2511993760745787392] map[category:5 cid:2504429915944783872]]

Очевидно, что это не то, что я хочу, потому что результатом cid являются 2511993760745787392 и 2504429915944783872, но мои оригинальные cid равны 2511993760745787586 и 2504429915944783937.
В дополнение к использованию структуры, есть ли лучший способ?

1 Ответ

8 голосов
/ 26 июня 2019

Нормальным способом сделать это будет структура:

type myStruct struct {
    Category string `json:"category"`
    CID      int64  `json:"cid"`
}

var oriInfo []myStruct
err := json.Unmarshal([]byte(pickled), &oriInfo)
// ... etc

Это должно решить вашу проблему, так как ваша проблема является результатом ошибки округления с плавающей запятой .

...