我正在创建一个原型文件(遵循cloudEvents标准)。
syntax = "proto3";
option go_package = "/events";
import "google/protobuf/timestamp.proto";
import "google/protobuf/any.proto";
message Event {
string specversion = 2;
string type = 3;
string source = 4;
string id = 5;
google.protobuf.Timestamp time = 6;
google.protobuf.Any data = 7;
map<string, CloudEventAttributeValue> attributes = 8;
string datacontenttype = 9;
string test = 10;
}它在客户端和服务器之间工作得很好。我们还希望确保这个对象完全符合cloudevents。为了测试这一点,如果我尝试使用json.marshal()编组这个对象,然后使用json.unmarshal将其解组为一个cloudEvent对象。在此测试中,由于proto object和cloudEvents之间的时间字段数据类型不匹配,反序列化正在中断。
bytes, _ := json.Marshal(ev)
fmt.Println(string(bytes))
e := cloudevents.NewEvent()
json.Unmarshal(bytes, &e)但是如果我去掉时间字段,一切都会正常工作。知道我错过了什么吗?
发布于 2021-08-15 17:00:19
时间真的应该是编程中第三难的事情(link)。
我不太熟悉Cloud Events,但我怀疑没有要求您能够使用默认编组。似乎您会对管理此映射的明确方式感到满意?
请在您的问题中包含生成的JSON。差异是什么?你有没有得到RFC3339格式的字符串表示,并且你想要,例如UNIX时代?
您可能需要一个自定义编组程序来将proto时间戳转换为UNIX纪元int,例如,对于Cloud事件。
发布于 2021-08-16 03:32:34
用protojson.Marshal代替json.Marshal解决了这个问题。在内部,它传递从proto标准进行编组所需的编组选项。
https://stackoverflow.com/questions/68784948
复制相似问题