当前位置: 首页 > 知识库问答 >
问题:

在gRPC原型中将字符串字段声明为JSON是一种好方法吗?

田佐
2023-03-14

因为在protobuf中,在某些场景中定义一个灵活的结构很麻烦。

例如:

message Foo {
   int a = 1;
   repeated int a_other = 2;
}

事实上,我不希望服务的客户端同时传递a和other。然而,在protobuf中,我们不能将这两个字段放在其中一个,因为另一个是列表字段。因此,声明了上述消息后,当我们只传递a\u other字段时,客户端无法判断a字段实际上是0还是服务器没有传递。

所以我想知道是否为Foo定义一个字符串字段,例如:

message Foo {
   string data = 1;
}

并且服务器端和客户端都同意将data字段视为JSON。所以服务器转储原始数据,客户端加载它,他们从此过上幸福的生活。

但我的问题是,这是一种常见的做法吗?它的缺点是什么?(当然,这样就不用进行类型检查)或者有更好的方法吗?

共有1个答案

司马建柏
2023-03-14

其中一个中的重复字段通常由包装消息解决。在您的情况下:

message Foo {
  oneof choose_one_a {
    int a = 1;
    AOtherMessage a_other = 2;
  }
}

message AOtherMessage {
  repeated int a_other = 1;
}

看来你可以轻松地停下来。

但是,如果您确实发现自己处于“我想要任意JSON在这里”的情况下,那么您可能需要考虑struct.protoValue而不是普通字符串。Value可以保存任意JSON值。如果您想保存任意JSON对象(也称为地图),请使用structstruct.proto中的类型是已知的原型类型,当将原型消息转换为JSON时,它们以原生JSON形式表示。

message Foo {
  google.protobuf.Value a = 1;
}

但是,在“删除模式并切换到JSON”之前,您应该咨询处理动态内容的不同方法。

 类似资料:
  • 问题内容: 我有一个doc_type,其映射类似于此非常简化的映射: 该字段应该是一个对象,带有一系列用于过滤目的的字母数字标识符。典型的文档将具有以下格式: 问题是,有时在索引编制过程中,对象字段中新字段的第一个索引内容将完全是数字形式,如上例所示。这导致Elasticsearch将该字段的类型推断为。但这是偶然的。该字段在另一个文档中可能是字母数字。当后面一个包含此字段中字母数字值的文档到达时

  • 问题内容: 我有3个选择: 声明及以后当我必须通过使用时”“。 声明及以后当我必须通过使用时。 声明及以后当我必须通过使用时。 我的意见: 最短的一个。但是,将转换为,这似乎并不优雅。 在我不喜欢,它并没有从字开始member,这是最重要的。我们只需要转换它。最好member是在开头,因为我最注意单词的开头。快速浏览一下,我知道“啊,我要通过会员了”。并与我的第一个浓度变为“啊,好吧......一

  • 我想知道我应该传递什么作为参数:var还是val?我应该添加私人修改吗?在哪种情况下是最佳实践?因为当我添加getter时,我必须将其改为var,但正如我所知,用Kotlin写val总是更好?

  • 问题内容: 这些声明和和之间有什么区别? 问题答案: 总是在堆上创建一个新对象 使用字符串池 试试这个小例子: 为避免在堆上创建不必要的对象,请使用第二种形式。

  • 本文向大家介绍Java将Date日期类型字段转换成json字符串的方法,包括了Java将Date日期类型字段转换成json字符串的方法的使用技巧和注意事项,需要的朋友参考一下 想必我们在做项目的时候,都会遇到服务端与客户端交互数据。一般情况下我们都会采用json格式或者xml格式,将服务端的数据转换成这两种格式之一。 但是,如果我们将数据转换成json格式的时候,我们也许会遇到Date日期型的数据

  • 本文向大家介绍Mysql字符串字段判断是否包含某个字符串的2种方法,包括了Mysql字符串字段判断是否包含某个字符串的2种方法的使用技巧和注意事项,需要的朋友参考一下 假设有个表: 初始化表,并添加些记录。     Mysql 中有些字段是字符串类型的,如何查找其中包含某些字符的记录呢? 方法一: 这样bb@email.com的用户也查出来了,不符合预期。 方法二: 利用mysql 字符串函数 f