Golang cloudEvent与原型时间数据类型不匹配



我正在创建一个原型文件(并遵循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;
}

它在客户端和服务器之间工作得很好。我们还想确保这个对象完全符合云事件。为了测试这一点,如果我尝试使用json.marshal()编组这个对象,然后使用json.marshal()反编组。反编组为一个cloudEvent对象。在这个测试中,由于原型对象和clouddevents之间的时间字段数据类型不匹配,反序列化被破坏。

bytes, _ := json.Marshal(ev)
fmt.Println(string(bytes))
e := cloudevents.NewEvent()
json.Unmarshal(bytes, &e)

但是如果我删除时间字段,一切都很好。你知道我错过了什么吗?

时间真的应该是编程中第三困难的事情。

我不太熟悉云事件,但我怀疑没有要求你能够使用默认封送。似乎您对管理此映射的确定方法感到满意?

请在您的问题中包含生成的JSON。差异在哪里?您是否获得RFC3339格式的字符串表示,并且您想要例如UNIX epoch?

您可能需要一个自定义编组器,将原始时间戳转换为UNIX epoch int,例如,用于Cloud Events。

使用protojson。Marshal代替json。Marshal解决了这个问题。在内部,它传递了从原型标准中封送所需的marshallingoption。

https://github.com/golang/protobuf/issues/1355

相关内容

最新更新