Я хочу сериализовать тип Dense
пакета gonum.org/v1/gonum/mat
. Из-за того, что я не могу реализовать методы для внешних типов, я создал тип
type DenseEx struct {
Mtx *mat.Dense
}
и реализовал метод MarshalJSON
следующим образом
func (d DenseEx) MarshalJSON() ([]byte, error) {
js := map[string]interface{}{}
rows, cols := d.Mtx.Dims()
js["cols"] = cols
js["rows"] = rows
fltVals := make([]float64, cols*rows)
for r := 0; r < rows; r++ {
for c := 0; c < cols; c++ {
i := r*cols + c
fltVals[i] = d.Mtx.At(r, c)
}
}
js["values"] = fltVals
return json.Marshal(js)
}
Это работает, как и ожидалось. Теперь у меня есть проблемы с демонтажем структуры.
func (d DenseEx) UnmarshalJSON(data []byte) error {
js := map[string]interface{}{}
err := json.Unmarshal(data, &js)
if err != nil {
return err
}
intf, ok := js["cols"]
if !ok {
return fmt.Errorf("tag 'cols' missing in JSON data")
}
var cols, rows int
cols, ok = intf.(int)
if !ok {
return fmt.Errorf("tag 'cols' cannot be converted to int")
}
...
return nil
}
Я не могу преобразовать значение тегов в его правильный тип. Мой тест json строка
var jsonStrs = []struct {
str string
expected DenseEx
description string
}{
{
str: "{\"cols\":3,\"rows\":2,\"values\":[6,1,5,2,4,3]}",
expected: DenseEx{
Mtx: nil,
},
description: "deserialization of a 2x3 matrice",
},
}
и мой код теста
...
for _, d := range jsonStrs {
var m DenseEx
err := m.UnmarshalJSON([]byte(d.str))
...
Я всегда получаю результат
matex_test.go:26: FAIL: deserialization of a 2x3 matrice: tag 'cols' cannot be converted to int
Есть идеи?
Заранее спасибо!