首页 > 解决方案 > 使用 scala 动态访问 protobuf 字段名称

问题描述

我是 Scala 的新手。编写我的第一个应用程序。

我已经使用字段 email_id 和 phone_number 定义了我的 proto 文件,这是 grpc 调用的请求定义

我可以通过点运算符访问值,例如 params.emailId

现在我想做的是我有一组必填字段。我想检查带有输入请求参数的数组中定义的那些字段的值。

我如何访问此参数。{数组中的字段名称}以检查非空值。

使用以下代码获取错误:

  val mandatoryFields = Array("emailId","phoneNumber")

  println(params.emailId) //works
  for (fields <- mandatoryFields) {
    println(fields)
    println(params.fields) // getting error
  }

它具有函数“in.getFieldByNumber()”,您可以在其中按索引位置获取值,是否有任何可用的函数,如 getFieldByName() 或类似的东西。

标签: scalaprotocol-buffersgrpcproto

解决方案


虽然距离提问日期已经很久了,但我不认为它是没有答案的。其实我有一个:

使用toPMessage方法,您将拥有 protobuffer 案例类作为PMessage对象的实例。然后,您可以检索Map[FieldDescriptor, PValue]. 按名称查找字段值如下:

val fieldDescriptorPValueMap: Map[FieldDescriptor, PValue] = params.toPMessage.value

mandatoryFields.foreach(fieldName=>{
      println(
        fieldDescriptorPValueMap
          .filter(entry => fieldName == entry._1.name)
          .values
          .head.as[String]
      )
})

推荐阅读