golang的json转pb验证-CSDN博客
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
基于这篇文章的最后一个代码进行验证。
1、准备
1依赖的第三方库
- github.com/golang/protobuf/jsonpb
- github.com/golang/protobuf/proto
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字段严格对齐。
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相当于不存在。
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后也缺少对应字段。
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名。
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,结果依然是能匹配过来的。