golang将JSON转换为Protobuf格式的在线工具插件JSON-to-Proto的使用
由于您提供的内容为"null",没有实际可参考的标题和内容信息,我无法基于不存在的材料生成回答。不过,我可以为您提供一个通用的Golang中将JSON转换为Protobuf的示例方案:
package main
import (
"encoding/json"
"fmt"
"log"
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/encoding/protojson"
// 假设有一个生成的protobuf包
example "path/to/your/protobuf/package"
)
func main() {
// 1. 准备JSON数据
jsonData := `{
"name": "John Doe",
"age": 30,
"email": "john@example.com"
}`
// 2. 创建目标protobuf消息结构
person := &example.Person{}
// 3. 使用protojson将JSON转换为protobuf
unmarshaler := protojson.UnmarshalOptions{
DiscardUnknown: true, // 忽略未知字段
}
if err := unmarshaler.Unmarshal([]byte(jsonData), person); err != nil {
log.Fatalf("JSON转换protobuf失败: %v", err)
}
// 4. 现在可以使用protobuf消息了
fmt.Printf("转换后的protobuf消息: %+v\n", person)
// 5. 如果需要将protobuf序列化为二进制格式
protoData, err := proto.Marshal(person)
if err != nil {
log.Fatalf("protobuf序列化失败: %v", err)
}
fmt.Printf("Protobuf二进制数据: %x\n", protoData)
}
注意事项:
- 需要先定义好.proto文件并生成对应的Go代码
- 需要安装protobuf编译器protoc和Go插件
- 需要导入google.golang.org/protobuf相关包
如果您能提供具体的JSON-to-Proto工具名称或更详细的需求,我可以给出更有针对性的回答。
更多关于golang将JSON转换为Protobuf格式的在线工具插件JSON-to-Proto的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang将JSON转换为Protobuf格式的在线工具插件JSON-to-Proto的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang JSON 转 Protobuf 工具使用指南
在 Golang 开发中,将 JSON 数据转换为 Protobuf 格式是一个常见需求。下面我将介绍如何使用在线工具和 Golang 代码实现这一转换。
在线工具推荐
-
JSON-to-Proto 在线转换器:
- 地址: https://json-to-proto.github.io/
- 特点: 简单易用,直接粘贴 JSON 即可生成对应的 Protobuf 定义
-
protoc 插件:
json-to-proto
插件可以通过 npm 安装:npm install -g json-to-proto
Golang 代码实现
1. 安装必要依赖
go get -u github.com/golang/protobuf/proto
go get -u github.com/golang/protobuf/jsonpb
2. 示例代码
假设我们有以下 JSON 数据:
{
"id": 123,
"name": "John Doe",
"email": "john@example.com",
"phones": [
{
"number": "555-4321",
"type": "HOME"
}
]
}
对应的 Protobuf 定义 (person.proto
):
syntax = "proto3";
package example;
message PhoneNumber {
string number = 1;
string type = 2;
}
message Person {
int32 id = 1;
string name = 2;
string email = 3;
repeated PhoneNumber phones = 4;
}
3. JSON 转 Protobuf 代码
package main
import (
"bytes"
"fmt"
"io/ioutil"
"log"
"github.com/golang/protobuf/jsonpb"
"github.com/golang/protobuf/proto"
"your_module_path/example" // 替换为你的实际模块路径
)
func main() {
// 1. 读取 JSON 数据
jsonData := `{
"id": 123,
"name": "John Doe",
"email": "john@example.com",
"phones": [
{
"number": "555-4321",
"type": "HOME"
}
]
}`
// 2. 创建空的 Protobuf 消息
person := &example.Person{}
// 3. 使用 jsonpb 解码 JSON
unmarshaler := jsonpb.Unmarshaler{}
err := unmarshaler.Unmarshal(bytes.NewReader([]byte(jsonData)), person)
if err != nil {
log.Fatalf("Failed to unmarshal JSON: %v", err)
}
// 4. 现在 person 已经包含了 JSON 数据
fmt.Printf("ID: %d\n", person.Id)
fmt.Printf("Name: %s\n", person.Name)
fmt.Printf("Email: %s\n", person.Email)
for _, phone := range person.Phones {
fmt.Printf("Phone: %s (%s)\n", phone.Number, phone.Type)
}
// 5. 如果需要,可以将 Protobuf 序列化为二进制格式
protoData, err := proto.Marshal(person)
if err != nil {
log.Fatalf("Failed to marshal proto: %v", err)
}
// 保存到文件
err = ioutil.WriteFile("person.pb", protoData, 0644)
if err != nil {
log.Fatalf("Failed to write proto file: %v", err)
}
fmt.Println("Protobuf data saved to person.pb")
}
自动生成 Protobuf 定义
如果你需要从 JSON 自动生成 Protobuf 定义,可以使用以下方法:
- 使用
json-to-proto
工具:
# 安装工具
go install github.com/chrusty/protoc-gen-jsonschema/cmd/protoc-gen-jsonschema@latest
# 使用示例
echo '{"name":"John","age":30}' | json-to-proto
- Golang 代码生成 Protobuf 定义:
package main
import (
"encoding/json"
"fmt"
"reflect"
)
func generateProtoFromJSON(jsonStr string, messageName string) string {
var data interface{}
if err := json.Unmarshal([]byte(jsonStr), &data); err != nil {
return fmt.Sprintf("Error parsing JSON: %v", err)
}
return generateProtoMessage(data, messageName, 0)
}
func generateProtoMessage(data interface{}, name string, indent int) string {
indentStr := ""
for i := 0; i < indent; i++ {
indentStr += " "
}
result := fmt.Sprintf("%smessage %s {\n", indentStr, name)
switch v := data.(type) {
case map[string]interface{}:
fieldNum := 1
for key, value := range v {
fieldType := protoTypeFromValue(value)
result += fmt.Sprintf("%s %s %s = %d;\n", indentStr, fieldType, key, fieldNum)
if fieldType == "message" {
nestedName := capitalizeFirst(key)
result += generateProtoMessage(value, nestedName, indent+1)
result += fmt.Sprintf("%s }\n", indentStr)
}
fieldNum++
}
default:
fieldType := protoTypeFromValue(v)
result += fmt.Sprintf("%s %s value = 1;\n", indentStr, fieldType)
}
result += fmt.Sprintf("%s}\n", indentStr)
return result
}
func protoTypeFromValue(value interface{}) string {
switch v := value.(type) {
case float64:
if v == float64(int64(v)) {
return "int64"
}
return "double"
case string:
return "string"
case bool:
return "bool"
case map[string]interface{}:
return "message"
case []interface{}:
if len(v) > 0 {
return "repeated " + protoTypeFromValue(v[0])
}
return "repeated string" // 默认类型
default:
return "string"
}
}
func capitalizeFirst(s string) string {
if len(s) == 0 {
return s
}
return string(s[0]-32) + s[1:]
}
func main() {
jsonStr := `{
"name": "John",
"age": 30,
"address": {
"street": "123 Main St",
"city": "New York"
},
"phones": ["123-456-7890"]
}`
protoDef := generateProtoFromJSON(jsonStr, "Person")
fmt.Println(protoDef)
}
总结
- 对于简单转换,可以使用在线工具快速生成 Protobuf 定义
- 在 Golang 代码中,使用
jsonpb
包可以方便地在 JSON 和 Protobuf 之间转换 - 对于动态生成 Protobuf 定义的需求,可以编写代码分析 JSON 结构并生成对应的 Protobuf 定义
以上方法可以帮助你在 Golang 项目中高效地处理 JSON 到 Protobuf 的转换需求。