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)
}

注意事项:

  1. 需要先定义好.proto文件并生成对应的Go代码
  2. 需要安装protobuf编译器protoc和Go插件
  3. 需要导入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 代码实现这一转换。

在线工具推荐

  1. JSON-to-Proto 在线转换器:

  2. 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 定义,可以使用以下方法:

  1. 使用 json-to-proto 工具:
# 安装工具
go install github.com/chrusty/protoc-gen-jsonschema/cmd/protoc-gen-jsonschema@latest

# 使用示例
echo '{"name":"John","age":30}' | json-to-proto
  1. 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)
}

总结

  1. 对于简单转换,可以使用在线工具快速生成 Protobuf 定义
  2. 在 Golang 代码中,使用 jsonpb 包可以方便地在 JSON 和 Protobuf 之间转换
  3. 对于动态生成 Protobuf 定义的需求,可以编写代码分析 JSON 结构并生成对应的 Protobuf 定义

以上方法可以帮助你在 Golang 项目中高效地处理 JSON 到 Protobuf 的转换需求。

回到顶部