0

我正在创建一个原型文件(并遵循 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 对象和 cloudEvents 之间的时间字段数据类型不匹配,反序列化正在中断。

bytes, _ := json.Marshal(ev)
fmt.Println(string(bytes))

e := cloudevents.NewEvent()
json.Unmarshal(bytes, &e)

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

4

2 回答 2

1

时间真的应该是编程中第三难的事情(链接)。

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

请在您的问题中包含生成的 JSON。差异是什么?您是否正在获取 RFC3339 格式的字符串表示并且您想要例如 UNIX 纪元?

您可能需要一个自定义编组器,将原始时间戳转换为 UNIX 纪元 int,例如,用于云事件。

于 2021-08-15T17:00:19.157 回答
0

使用 protojson.Marshal 代替 json.Marshal 解决了这个问题。在内部,它通过了从原始标准编组所需的编组选项。

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

于 2021-08-16T03:32:34.427 回答