Unmarshal для структуры со слайсом возвращает пустое значение вместо пустого слайса - PullRequest
0 голосов
/ 26 октября 2019

Если я создаю «фотографию» без каких-либо тегов, она сохраняется в DynamodB как

"tags": {
   "NULL": true
}, 

Но когда я запрашиваю и разбираю запись, я ожидаю, что вместо этого она преобразуется в пустой фрагмент, и я получаюthis:

[{"photo_id":"bmpuh3jg","tags":null}]

Возможно ли вместо этого преобразовать его в пустой срез? например,

[{"photo_id":"bmpuh3jg","tags":[]}]

ПРИМЕР КОДА

Моя структура

type Photo struct {
    Id        string   `json:"photo_id"`
    Tags      []string `json:"tags"`
}

Запрос

photo := &Photo{}
input := &dynamodb.QueryInput{
    TableName:                 aws.String("local.photos"),
    KeyConditionExpression:    aws.String("photo_id = :photo_id"),
    ExpressionAttributeValues: map[string]*dynamodb.AttributeValue{
        ":photo_id": {
            S: aws.String(photo_id),
        },
    },
}
db_result, err := db.Query(input)
if err != nil {
    return nil, err
} else if *db_result.Count == int64(0) {
    // No item found
    return nil, err
}

err = dynamodbattribute.UnmarshalListOfMaps(db_result.Items, photo)
if err != nil {
    return nil, err
}

photoJSON, err := json.Marshal(photo)
if err != nil {
    return nil, err
}

return photoJSON, nil

1 Ответ

2 голосов
/ 26 октября 2019

Если я правильно понимаю ваш вопрос, чтобы добиться результата с пустым срезом для тегов ({"photo_id":"bmpuh3jg","tags":[]}), вы можете сделать это следующим образом:

  jsonString := `{"photo_id":"bmpuh3jg","tags":null}`

  photo := &Photo{}
  err := json.Unmarshal([]byte(jsonString), &photo)
  if err != nil {
     fmt.Println(err.Error())
  }

  // Here is a trick. Replace nil with an empty slice.
  if photo.Tags == nil {
    photo.Tags = []string{}
  }
  elemJSON, err := json.Marshal(photo)
  if err != nil {
    fmt.Println(err.Error())
  }
  fmt.Println(string(elemJSON)) //{"photo_id":"bmpuh3jg","tags":[]} 

Чтобы понять, почему кодируется ноль срезав качестве нулевого JSON вы можете проверить официальную документацию https://golang.org/pkg/encoding/json/

Значения массива и слайса кодируются как массивы JSON, за исключением того, что байт [] кодируется как строка в кодировке base64, а нулевой слайс кодируется какнулевое значение JSON.

Проверка на игровой площадке Go: https://play.golang.org/p/BsxTpBlypV5

...