一、json转protobuf后判断某字段是否被赋值

方法1:

//hasButtonDelayTime()返回false是json转protobuf时没给ButtonDelayTime赋值,它依然是默认值
CbiMsg.Button button = proto.getButton().getListList().get(j);
System.out.println(button.hasButtonDelayTime());

方法2:字段很多时可以公共方法比方法1方便

CbiMsg.MsgProto.Builder proto = CbiMsg.MsgProto.newBuilder();
//获取数据库json
String content = contentsList.get(i).getDataContent();
//json转protobuf
JsonFormat.merge(content, proto);
//proto中所有字段都有,content有部分字段,先proto需要序列化build,再获取
//proto中有signal,signal下有list
//getAllFields是获取protobuf中字段名称Descriptors.FieldDescriptor和值Object
Map<Descriptors.FieldDescriptor, Object> fs = proto.build().getSignal().getListList().get(j).getAllFields();

二、具体实现

例1

1、protobuf文件:

message InterfaceProto {required int32 number = 1;repeated InterfaceInfo list = 2;message InterfaceInfo{optional int32 direction = 1 [default=0];optional int32 crc = 2 [default=0];optional bytes data = 3 ;//接口数据optional string version = 4 ;}
}

2、对应实体类:

package com.rpmc.protoEntity.InterfaceData;
import java.util.List;
public class InterfaceInfo {private int number;private List<InterfaceData> loopList1;private long receiveTime;}
package com.rpmc.protoEntity.InterfaceData;
public class InterfaceData {private int direction;//接口数据方向private byte[] data;//接口数据}

3、protobuf转为json

//外proto结构入库
Msg.InterfaceProto.Builder interfaceProto2 = Msg.InterfaceProto.newBuilder();//JSON字符串转对象
InterfaceInfo interfaceDataList = JSON.parseObject(cppMsg, InterfaceInfo.class);//内部proto入库
Msg.InterfaceProto.InterfaceInfo.Builder interfaceInfo2 = Msg.InterfaceProto.InterfaceInfo.newBuilder();//获取接口数据: 字节数组
byte[] data = interfaceDataList.getLoopList1().get(i).getData();//在protobuf中,字节数组转为byteString
ByteString dataStr = ByteString.copyFrom(data);//data在protobuf中是字节数组,set值需要ByteString类型
interfaceInfo2.setData(dataStr);
interfaceInfo2.setVersion(version);
interfaceProto2.addList(interfaceInfo2);//生成入库的proto结构,其中data数据还是ByteString类型
Msg.InterfaceProto interfaceProtocol2 = interfaceProto2.build();//将protobuf格式的interfaceProtocol2,转为JSON的string字符串
// 将此字符串str入库到dataContent中
String str = JsonFormat.printToString(interfaceProtocol2);

4、json转protobuf

//定义新protobuf结构 interfaceProtol3Msg.InterfaceProto.Builder interfaceProtol3 = Msg.InterfaceProto.newBuilder();//将json的string字符串str ,转为protobuf格式interfaceProto3JsonFormat.merge(str,interfaceProtol3);

5、data的原始16进制数据

24 5f a5 fa ff ff ff 07 00 00 00 00 00 e8 ff ff ef 9e 31
10 00 58 fa 03 c8 55 71 53 55 ff ff bf ff 3f b2 ff 07 0b 24 

6、解析为字节数组

[36,95,-91,-6,-1,-1,-1,7,0,0,0,0,0,-24,-1,-1,-17,-98,49,16,0,88,-6,3,-56,85,113,83,85,-1,-1,-65,-1,63,-78,-1,7,11,36,15,48,0,3,-128,0,0,0,8,100,32,56,24,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,89,-86,-91,-86,-91,-86,-

7、字节数组转为ByteString

[36,95,-91.....]

8、以字符串,set进protobuf

例2:将json序列化成protobuf数组

/*** 将json序列化成protobuff数组* @param list 入参* @return List<HttpTccHistory>:返回前端所需要String集合(protobuff)*/
public static List<HttpCbiContents> transToContentsByPI(List<HttpCbiContents> list)
{List<HttpCbiContents> lis=new ArrayList<HttpCbiContents>();try {for (HttpCbiContents his : list) {//创建protobuf的Builder Message.Builder newbulid = CbiMsg.MsgProto.newBuilder();//getDataContent为字符串string//string类型的json转换为protobufJsonFormat.merge(his.getDataContent(), newbulid);//protobuf转换为字节数组byte[] byts = newbulid.build().toByteArray();//字节数组转换为stringString protoStr = Arrays.toString(byts);//创建新的list,存放转换后的stringHttpCbiContents httpCbiContent=new HttpCbiContents();//将参数HttpCbiContents 类 复制  到 新建的httpCbiContentBeanUtils.copyProperties(his,httpCbiContent);//给新建httpCbiContent的DataContent属性赋值 httpCbiContent.setDataContent(protoStr);lis.add(httpCbiContent);}}catch (Exception e){log.error(e.getMessage());}return lis;
}

JSON字符串与protobuf互转相关推荐

  1. iOS开发JSON字符串和字典互转

    1.相关属性简述 NSJSONReadingOptions读取属性: typedef NS_OPTIONS(NSUInteger, NSJSONReadingOptions) {NSJSONReadi ...

  2. jQuery 中json字符串与对象互转

    json字符串转json对象:jQuery.parseJSON(jsonStr); json对象转json字符串:JSON.stringify(jsonObj); 转载于:https://www.cn ...

  3. JSON字符串与Map互转

    map转为json字符串 public static String map2jsonstr(Map<String,?> map){return JSONObject.toJSONStrin ...

  4. iOS开发--字典(NSDictionary)和JSON字符串(NSString)之间互转

    1. 字典转Json字符串 // 字典转json字符串方法 -(NSString *)convertToJsonData:(NSDictionary *)dict { NSError *error; ...

  5. Javascript json字符串和数组互转 json格式化html

    关键点在这里JSON.stringify(mock,null,4).toString()有格式化的作用,v-model以后取到的是字符串,所有都得转成数组结构. <div id="ap ...

  6. ajax返回字符串怎么处理,ajax请求返回json字符串/json对象 处理

    1. 返回json字符串如何处理 $.ajax({ url:xxx, success:function(date){ }, error:function(){ } }); 通过最原始的返回: Prin ...

  7. javascript json和json字符串互转

    javascript json和json字符串互转 <!DOCTYPE html> <html lang="en"><head><meta ...

  8. Java中普通字符串转json_java普通对象和json字符串的互转

    一.java普通对象和json字符串的互转 java对象---->json 首先创建一个java对象: 现在java对象转换为json形式: 定义了一个Student的实体类,然后分别使用了JS ...

  9. Jackson使用:String 与对象互转、Jackson 从 json 字符串转换出对象

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. 一.从json字符串转换出对象 Pager类: import com.fasterxml.jacks ...

最新文章

  1. 解决流程自动化“最后一公里问题”,达观数据发布智能 RPA
  2. 自己归纳整理的ARM THUMB指令机器码表
  3. linux 全新编译安装,全新linux中通过编译方式安装nginx
  4. SHA-1算法c语言实现
  5. 网络数据包收发流程(四):协议栈之packet_type
  6. 温故而知新!这篇文章可以满足你80%日常工作!面试真题解析
  7. 学习 Spring Boot:(二十九)Spring Boot Junit 单元测试
  8. java 秒表时间格式化_java方法计时器,懒汉式,转换为00:00:00格式
  9. 关于win7启动看不到桌面的解决方法
  10. php5.6软件下载,【PHP下载】PHP for Linux 5.6.6-ZOL软件下载
  11. 【Redis高手修炼之路】客户端工具——客户端工具以及常用命令
  12. 三极管饱和状态的判断
  13. 如何获得静态IP资源?
  14. secedit.exe本地安全策略命令
  15. 练习:尼姆游戏(聪明版/傻瓜式•人机对战)
  16. 微信小程序 Unexpected token in JSON at position 0 设置二维码,并且使用js中JSON.parse()函数将二维码返回的值转化为json格式
  17. 在Mac中删除残留的启动台图标
  18. ESP8266-Arduino编程实例-OLED显示DHT22传感器数据
  19. 电子称DIY(贴应变片+写代码)
  20. java maven 引入有赞云SDK

热门文章

  1. 使用IE浏览器,禁止访问,显示 Internet Explorer增强安全配置正在阻止来自下列网站的从应用程序中的内容
  2. Android Wear与Apple Watch交互设计对比
  3. 做电商不一定要有团队,兼职宝妈也能玩转无货源电商
  4. 今天的天气是多么的晴朗
  5. springboot+dubbo+mybatis(注册中心使用的是zookeeper)学习
  6. 史上最强ASR非特定人声语音识别模块,完爆LD3320
  7. SOLID原理的详细信息。
  8. div框阴影外发光效果
  9. 去除带下划线的word文档答案
  10. 解决不同版本jar包引入问题,修改jar包包名