登录
首页 >  Golang >  Go问答

接收任意字段值类型的 JSON 并解析到 mapany 的 protobuf 使用指南

来源:stackoverflow

时间:2024-03-04 18:03:25 312浏览 收藏

小伙伴们有没有觉得学习Golang很有意思?有意思就对了!今天就给大家带来《接收任意字段值类型的 JSON 并解析到 mapany 的 protobuf 使用指南》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!

问题内容

这是我的原型文件:

import "google/protobuf/struct.proto";

service renderer {
  rpc render(request) returns (response) {}
}

message request {
  string template = 1;
  string locale = 2;
  google.protobuf.struct variables = 3;
}

在以下函数中:

func (s *server) render(
    ctx context.context,
    message *request,
) (*response, error) {
    fmt.println(message.variables.asmap()) // is always empty

    return &response{}, nil
}

即使我将其发送到服务器,变量字段也始终为空:

{
    "template": "template_name",
    "locale": "pt",
    "variables": {
        "foo": "bar"
    }
}

我期望 variables 包含 foo 作为键,bar 作为值。我做错了什么?万一我做错了,我该怎么做才能实现这一目标?


正确答案


看看 structpb。它包含一个不错的示例。

您不能使用下面的 json 示例,因为它是 map[string]string,并且这不足以通用来表示动态类型。

variables": {
  "foo": "bar"
}

如果您使用 structpb 生成 {"foo":"bar"} 值:

package main

import (
    "log"

    "google.golang.org/protobuf/types/known/structpb"
)

func main() {
    v, err := structpb.newstruct(map[string]interface{}{
        "foo": "bar",
    })
    if err != nil {
        log.fatal(err)
    }

    log.println(v)
}

您将看到 v 在 go 中表示为:

fields:
  key:"foo" 
  value:{
    string_value:"bar"
  }
}

这是 server.render 在代码中作为 message.variables 所期望的。

好了,本文到此结束,带大家了解了《接收任意字段值类型的 JSON 并解析到 mapany 的 protobuf 使用指南》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>