Golang使用proto3协议导致零值字段不显示

问题描述

proto协议生成的结构体如果使用直接转成json会导致零值字段不显示,这样的json是有毛病的,可以使用如下方法解决

示例Demo

package main

import (
"./pb"
"bytes"
"encoding/json"
"fmt"
"github.com/golang/protobuf/jsonpb"
"github.com/golang/protobuf/proto"
) func main() {
var i int32 = 0
test(i)
} func test(t int32) {
d := &pb.FrameD6 {
Datetimehour: "2020033014",
Recordcnt: t,
}
str,_ := json.Marshal(d)
s := TransProtoToJson(d)
fmt.Printf("@@@--incorrect JSON---> %+v \n",string(str))
fmt.Printf("@@@--correct JSON---> %+v \n",s)
} func TransProtoToJson (pb proto.Message) string{
var pbMarshaler jsonpb.Marshaler
pbMarshaler = jsonpb.Marshaler{
EmitDefaults: true,
OrigName: true,
EnumsAsInts: true,
}
_buffer := new(bytes.Buffer)
_ = pbMarshaler.Marshal(_buffer, pb)
return string(_buffer.Bytes())
}

运行结果

@@@--incorrect JSON---> {"datetimehour":"2020033014"}
@@@--correct JSON---> {"recordid":"","laneid":"","programver":"","datetimehour":"2020033014","recordcnt":0,"moneycnt":0,"companyid":"","parkid":""}

Golang使用proto3协议导致零值字段不显示的更多相关文章

  1. golang之类型零值初始化及比较

    综述 变量声明时未赋初值,则变量被自动赋值为该类型的零值(固定值) func new(Type) *Type new()返回一个指针,指向新分配的该类型的零值,不是空指针(nil).the value ...

  2. 【Go入门教程2】内置基础类型(Boolean、数值、字符串、错误类型),分组,iota枚举,array(数值),slice(切片),map(字典),make/new操作,零值

    这小节我们将要介绍如何定义变量.常量.Go内置类型以及Go程序设计中的一些技巧. 定义变量 Go语言里面定义变量有多种方式. 使用var关键字是Go最基本的定义变量方式,与C语言不同的是Go把变量类型 ...

  3. solr 通过【配置、多值字段、动态字段】来解决文本表达式查询精确到句子的问题

    一.Solr Multivalue field属性positionIncrementGap理解 分类:Lucene 2014-01-22 10:39阅读(3596)评论(0) 参考:http://ro ...

  4. 【Go入门教程4】变量(var),常量(const),内置基础类型(Boolean、数值 byte,int,rune、字符串、错误类型),分组,iota枚举,array(数值),slice(切片),map(字典),make/new操作,零值

    这小节我们将要介绍如何定义变量.常量.Go 内置类型以及 Go 程序设计中的一些技巧. 定义变量 Go 语言里面定义变量有多种方式. 使用 var 关键字是 Go 最基本的定义变量方式,与 C 语言不 ...

  5. MySQL关于日期为零值的处理

    前言: 前面文章我们介绍过日期和时间字段的查询方法,最近遇到日期值为零的问题.原来了解过和 sql_mode 参数设置有关,但还不是特别清楚,本篇文章将探究下MySQL怎么处理日期值为零的问题. 1. ...

  6. 使用protobuf-java-format包 JsonFormat转Json部分默认值字段消失问题

    使用protobuf-java-format包 JsonFormat转Json部分默认值字段消失问题 1.产生的bug XXXXXXXXRequest.Builder request = XXXXXX ...

  7. C++与零值比较

    1.布尔值与零值的比较 if(flag)//if为真 if(!flag)//if为假 其它都为不良风格: if (flag == TRUE) ) if (flag == FALSE) ) 2.整形值与 ...

  8. 写出bool,int,float,指针与零值比较的if语句

    这个里面float与零值的比较颇有些意思. bool: bool flag; if (flag == true) return; int: int var; if (var == 0) { retur ...

  9. BOOL,int,float,指针变量与零值比较的if语句

    1.注意这里说的是,与零值比较,而不是与零比较. 2.对于int类型,与零值比较就是: if(var == 0) //零值 3.对于bool类型,零值表示false,任何非零值表示true,因此使用: ...

随机推荐

  1. 封装了一些sqlsugar的常用方法 用来动态切换数据库和依赖注入 支持泛型

    接口: /// <summary> /// 数据库操作 /// </summary> public interface IDAL_Services { /// <summ ...

  2. FreeSWITCH的安装与使用

    FreeSWITCH

  3. DVWA--SQL Injection

    sql注入是危害比较大的一种漏洞,登录数据库可以进行文件上传,敏感信息获取等等. Low 先来看一下源码 <?php if( isset( $_REQUEST[ 'Submit' ] ) ) { ...

  4. prometheus管理api

    健康检查:GET /-/healthy 准备检查:GET /-/ready 停止服务:PUT|POST /-/quit 重载配置文件 PUT|POST /-/reload reference mana ...

  5. css背景|列表样式

    背景样式 背景区包含内容.padding 和 boder 不包含外边距 background-color 设置元素的背景颜色 background-image 把图像设置为背景,包含内边距和边框,不包 ...

  6. 利用stat指令查看文件创建时间

    -shroot@test-W330-C30:/# stat * 文件:'b' 大小:4096 块:8 IO 块:4096 目录设备:802h/2050d Inode:5636097 硬链接:2权限:( ...

  7. kubernetes 监控(14)

    一.Weave Scope 容器地图 创建 Kubernetes 集群并部署容器化应用只是第一步.一旦集群运行起来,我们需要确保一切正常,所有必要组件就位并各司其职,有足够的资源满足应用的需求.Kub ...

  8. k8s健康检查(9)

    一.默认的健康检查 强大的自愈能力是 Kubernetes 这类容器编排引擎的一个重要特性.自愈的默认实现方式是自动重启发生故障的容器.除此之外,用户还可以利用 Liveness 和 Readines ...

  9. 10.12 telnet:远程登录主机

    telnet命令 以前是用于登录远程主机,对远程主机进行管理的.但是因为telnet是采用明文传送报文的,其安全性不好,因此现在很多Linux服务器都不开放telnet服务,而是改用更安全的SSH服务 ...

  10. 10.7 netstat:查看网络状态

    netstat命令 用于显示本机网络的连接状态.运行端口和路由表等信息. netstat命令的参数选项及说明 -r 显示路由表信息,该功能类似于前面学过的route 和ip route-g 显示多播功 ...