DynamoDB UnmarshalListOfMaps создает пустые значения в Go

avatar
John
8 апреля 2018 в 04:25
1728
1
1

Я помещаю элемент из файла json, мой код может выводить результат сканирования в формате json, но при попытке преобразовать его в мой тип с помощью встроенного процесса создаются только пустые/нулевые значения.

Ожидается: 0, помидор, 0,50

Факт: 0, , 0

item.json

{
    "id" : {"N" : "0"},
    "description" : {"S": "tomato"},
    "price" : {"N": "0.50"}
}

product.go

type product struct {
    id          int
    description string
    price       float64
}

Моя функция запроса:

func listAllProducts() []product {
    sess, err := session.NewSession(&aws.Config{
        Region: aws.String("us-east-1"),
    },
    )
    svc := dynamodb.New(sess)
    productList := []product{}

    input := &dynamodb.ScanInput{
        TableName: aws.String("Products"),
    }
    result, err := svc.Scan(input)
    err = dynamodbattribute.UnmarshalListOfMaps(result.Items, &productList)
    return productList
}

Выходной код

productList := listAllProducts()

    for _, p := range productList {
        log.Println(strconv.Itoa(p.id) + ", " + p.description + ", " + strconv.FormatFloat(p.price, 'f', -1, 64))
    }
Источник

Ответы (1)

avatar
mu is too short
8 апреля 2018 в 05:28
6

В Marshal документации говорится:

Все поля структуры и анонимные поля маршалируются, если не выполняется какое-либо из следующих условий.

  • поле не экспортируется

В документации Unmarshal ничего не упоминается о неэкспортируемых полях, но в Go обычно и ожидается, что десортировка также будет игнорировать неэкспортируемые поля (вы даже не можете установить неэкспортируемые поля все-таки используя отражение Go).

Я не очень хорошо разбираюсь в DynamoDB, но, возможно, вам повезло бы, если бы ваши поля были экспортированы:

type product struct {
    Id          int
    Description string
    Price       float64
}

Есть теги структуры dynamodbav, если вам нужно маршалировать структуру с именами полей в нижнем регистре.

Я бы также рекомендовал обратить внимание на ошибку, которую возвращает dynamodbattribute.UnmarshalListOfMaps:

err = dynamodbattribute.UnmarshalListOfMaps(result.Items, &productList)
if err != nil {
    /* Do something with the error here even if you just log it. */
}

Аналогично для вызова svc.Scan(input) и всего остального, что возвращает ошибку.