在与 DynamoDB 通信时,我一直在使用 Protobuf 进行对象定义。到目前为止,这些对象看起来像这样:type Record struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields Id string `protobuf:"bytes,2,opt,name=id,json=id,proto3" dynamodbav:"id,omitempty" json:"id,omitempty"` Name string `protobuf:"bytes,3,opt,name=name,json=name,proto3" dynamodbav:"name,omitempty" json:"name,omitempty"` OrgId string `protobuf:"bytes,4,opt,name=org_id,json=orgId,proto3" dynamodbav:"org_id,omitempty" json:"org_id,omitempty"` AccountId string `protobuf:"bytes,7,opt,name=account_id,json=accountId,proto3" dynamodbav:"account_id,omitempty" json:"account_id,omitempty"` Address string `protobuf:"bytes,9,opt,name=address,proto3" dynamodbav:"address,omitempty" json:"address,omitempty"` BillingTitle string `protobuf:"bytes,10,opt,name=billing_title,json=billingTitle,proto3" dynamodbav:"billing_title,omitempty" json:"billing_title,omitempty"`}这段代码不会惊慌,我会看到 DynamoDB 中的值。但是,omitempty从所有标签中删除该子句后dynamodbav,我注意到现在失败并出现以下错误:ValidationException: Invalid attribute value type status code: 400, request id: 6a626232-fcd4-4999-afe4-3df5769ce1b2我想使用默认值而不是前者,NULL: true但我没有看到任何序列化选项。有没有办法在不实现 DynamoDB 封送器接口的情况下做到这一点?
1 回答

郎朗坤
TA贡献1921条经验 获得超9个赞
经过一番调查,我在这里Marshal
找到了该函数的源代码。据此,我可以设置一个名为的字段来告诉编码器我希望将空字符串作为字符串发送,而不是作为空属性发送。但是,如果我设置它,我不能直接使用, 。所以,我复制了它们并写了我自己的:NullEmptyString
Marshal
MarshalMap
MarshalList
func MarshalMap(in interface{}) (map[string]*dynamodb.AttributeValue, error) {
av, err := getEncoder().Encode(in)
if err != nil || av == nil || av.M == nil {
return map[string]*dynamodb.AttributeValue{}, err
}
return av.M, nil
}
func getEncoder() *dynamodbattribute.Encoder {
encoder := dynamodbattribute.NewEncoder()
encoder.NullEmptyString = false
return encoder
}
- 1 回答
- 0 关注
- 80 浏览
添加回答
举报
0/150
提交
取消