golang的json转pb验证

基于这篇文章的最后一个代码进行验证。

https://blog.csdn.net/mijichui2153/article/details/133894403?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22133894403%22%2C%22source%22%3A%22mijichui2153%22%7D

1、准备

(1)依赖的第三方库

(2)创建person.proto文件

复制代码
syntax = "proto3";

package person;

message Person {
  string id = 1 [json_name = "myid"];
  string nickName = 2;
  string pen_name = 3;
  string name = 4;
  int32  age = 5 [json_name = "myage"];
  string Email = 6;
  string FullName = 7;
}

(3)构建可执行文件myperson.go

注:json字段与pb字段严格对齐。

Go 复制代码
package main
import (
        "fmt"
        "json2pb/person"

        "github.com/golang/protobuf/jsonpb"
)

func main() {
        jsonStr := `
        {
                "id":"342224199110521627",
                "nickName":"bangbang",
                "pen_name":"luxun",
                "name":"shuozhuo",
                "age":18,
                "Email":"2300659533@qq.com",
                "FullName":"zhuoshuo"
        }
        `
        fmt.Println("jsonStr is:", jsonStr)
        p1 := &person.Person{}
        jsonpb.UnmarshalString(jsonStr, p1)
        fmt.Println("p1=", p1.String())

}

此时执行结果如下:

2、验证各关注点

2.1、proto定义不变json中多了若干字段会如何?

结论:json比proto多出来的字段不会被解析到pb,相当于不存在。

Go 复制代码
package main
import (
        "fmt"
        "json2pb/person"

        "github.com/golang/protobuf/jsonpb"
)

func main() {
        jsonStr := `
        {
                "id":"342224199110521627",
                "nickName":"bangbang",
                "school":"ZJU",
                "pen_name":"luxun",
                "name":"shuozhuo",
                "age":18,
                "Email":"2300659533@qq.com",
                "FullName":"zhuoshuo",
                "country":"china"
        }
        `
        fmt.Println("jsonStr is:", jsonStr)
        p1 := &person.Person{}
        jsonpb.UnmarshalString(jsonStr, p1)
        fmt.Println("p1=", p1.String())
}

在jsonStr中新增了school、country两个字段。执行结果如下:

2.2、proto定义不变json中少了若干字段会如何?

结论:jsonStr中缺的字段转到pb后也缺少对应字段。

Go 复制代码
package main
import (
        "fmt"
        "json2pb/person"

        "github.com/golang/protobuf/jsonpb"
)

func main() {
        jsonStr := `
        {
                "id":"342224199110521627",
                "country":"china",
                "name":"shuozhuo",
                "age":18,
                "Email":"2300659533@qq.com",
                "FullName":"zhuoshuo"
        }
        `
        fmt.Println("jsonStr is:", jsonStr)
        p1 := &person.Person{}
        jsonpb.UnmarshalString(jsonStr, p1)
        fmt.Println("p1=", p1.String())
}

在jsonStr中移除nickName、pen_name字段,执行结果如下:

2.3、json有pb不存在的字段会如何?

和2.1是完全一样的。例如将jsonStr中的nickName改成nickName1,就会被当成一个全新字段。

2.4、pb中定义的json_name是否生效?

结论:转pb时候,json中的字段名会尝试匹配proto字段名以及其后的json_name名。

Go 复制代码
package main
import (
        "fmt"
        "json2pb/person"

        "github.com/golang/protobuf/jsonpb"
)

func main() {
        jsonStr := `
        {
                "myid":"342224199110521627",
                "nickName":"bangbang",
                "pen_name":"luxun",
                "name":"shuozhuo",
                "myage":18,
                "Email":"2300659533@qq.com",
                "FullName":"zhuoshuo"
        }
        `
        fmt.Println("jsonStr is:", jsonStr)
        p1 := &person.Person{}
        jsonpb.UnmarshalString(jsonStr, p1)
        fmt.Println("p1=", p1.String())
}

如图将jsonStr中的id字段改成proto中id字段的别名myid、age改成myage,结果依然是能匹配过来的。

相关推荐
饭碗的彼岸one5 分钟前
C++设计模式之单例模式
c语言·开发语言·c++·单例模式·设计模式·饿汉模式·懒汉模式
kimble_xia@oracle6 分钟前
SQL 笔记
java·数据库·oracle
David爱编程21 分钟前
深度解析:synchronized 性能演进史,从 JDK1.6 到 JDK17
java·后端
脑子慢且灵40 分钟前
【JavaWeb】一个简单的Web浏览服务程序
java·前端·后端·servlet·tomcat·web·javaee
青铜发条40 分钟前
【Qt】PyQt、原生QT、PySide6三者的多方面比较
开发语言·qt·pyqt
B612 little star king1 小时前
力扣29. 两数相除题解
java·算法·leetcode
野犬寒鸦1 小时前
力扣hot100:环形链表(快慢指针法)(141)
java·数据结构·算法·leetcode·面试·职场和发展
上官浩仁1 小时前
springboot synchronized 本地锁入门与实战
java·spring boot·spring
Gogo8161 小时前
java与node.js对比
java·node.js
SmartJavaAI1 小时前
Java调用Whisper和Vosk语音识别(ASR)模型,实现高效实时语音识别(附源码)
java·人工智能·whisper·语音识别