json 是一种很简洁的协议,但可惜的是,它只能传递基本的数型(int,long,string等),但不能传递byte类型。如果想要传输图片等二进制文件的话,是没办法直接传输。

本文提供一种思路给大家参考,让大家可以在json传输二进制文件,如果大家有这个需求又不知怎么实现的话,也许本文能够帮到你。思想适用于所有语言,本文以java实现,相信大家很容易就能转化为自己懂得语言。

思路

1. 读取二进制文件到内存

2. 用Gzip压缩一下。毕竟是在网络传输嘛,当然你也可以不压缩。

3. 用Base64 把byte[] 转成字符串

补充:什么是Base64

以下摘自阮一峰博客,Base64的具体编码方式,大家可以直接进入。

Base64是一种编码方式,它可以将8位的非英语字符转化为7位的ASCII字符。这样的初衷,是为了满足电子邮件中不能直接使用非ASCII码字符的规定,但是也有其他重要的意义:

a)所有的二进制文件,都可以因此转化为可打印的文本编码,使用文本软件进行编辑;

b)能够对文本进行简单的加密。

实现

主要思路就是以上3步,把字符串添加到json字段后发给服务端,然后服务器再用Base64解密–>Gzip解压,就能得到原始的二进制文件了。是不是很简单呢?说了不少,下面我们来看看具体的代码实现。

***注:Java SE是没办法直接用Base64的哦,必须要先自己去下载一份。但Android已经集成了Base64,因此大家可以直接在Android使用。

/**

* @author xing

*/

public class TestBase64 {

public static void main(String[] args) {

byte[] data = compress(loadFile());

String json = new String(Base64.encodeBase64(data));

System.out.println("data length:" + json.length());

}

/**

* 加载本地文件,并转换为byte数组

* @return

*/

public static byte[] loadFile() {

File file = new File("d:/11.jpg");

FileInputStream fis = null;

ByteArrayOutputStream baos = null;

byte[] data = null ;

try {

fis = new FileInputStream(file);

baos = new ByteArrayOutputStream((int) file.length());

byte[] buffer = new byte[1024];

int len = -1;

while ((len = fis.read(buffer)) != -1) {

baos.write(buffer, 0, len);

}

data = baos.toByteArray() ;

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

if (fis != null) {

fis.close();

fis = null;

}

baos.close() ;

} catch (IOException e) {

e.printStackTrace();

}

}

return data ;

}

/**

* 对byte[]进行压缩

*

* @param 要压缩的数据

* @return 压缩后的数据

*/

public static byte[] compress(byte[] data) {

System.out.println("before:" + data.length);

GZIPOutputStream gzip = null ;

ByteArrayOutputStream baos = null ;

byte[] newData = null ;

try {

baos = new ByteArrayOutputStream() ;

gzip = new GZIPOutputStream(baos);

gzip.write(data);

gzip.finish();

gzip.flush();

newData = baos.toByteArray() ;

} catch (IOException e) {

e.printStackTrace();

} finally {

try {

gzip.close();

baos.close() ;

} catch (IOException e) {

e.printStackTrace();

}

}

System.out.println("after:" + newData.length);

return newData ;

}

}

最后输出了一下字符串长度,大家也许觉得经过压缩也没降低多少体积嘛。但大家可以试试不用gzip,你会发现经过转换的字符串比原来大多了。没办法,这是由Base64的算法决定的。所以嘛,还是压缩一下好。

本文所使用的方法比较简单,大家如果有更好或者觉得有更好的方式,不妨一起探讨一下。

最后顺便吐槽一下Java,竟然写了这么多行代码。要是用Python,估计没几行就能搞定了。

java json转二进制数据_Json二进制数据相关推荐

  1. python json解析 超过对象_json序列化数据超出最大值(maxJsonLength)

    标签: 1.序列化: 以下代码在对象过大时会报错:进行序列化或反序列化时出错.字符串的长度超过了为 maxJsonLength 属性设置的值. //jsonObj比较大的时候会报错 var seria ...

  2. java json传值到前台_json前后台传值

    谈到JSON,简单的说就是一种数据交换格式.近年来,其在服务器之间交换数据的应用越来越广,相比XML其格式更简单.编解码更容易.扩展性更好,所以深受开发人员的喜爱. 下面简单的写一下在项目中前后台js ...

  3. java json不能正常解析_JSON格式正确,无法解析问题解决方法

    解析的时候出JSONException:java.lang.String cannot be converted to JSONObject解决办法 在用org.json.JSONObject 解析从 ...

  4. Pandas载入数据(csv, JSON,XML,Excel,二进制数据,网页数据,数据库数据)

    数据载入,存储及文件格式 这里用到的样本数据git地址:https://github.com/wesm/pydata-book 访问数据是使用各类工具所必须的第一步(获取数据).这里重点讨论使用pan ...

  5. 【Android 逆向】使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 反汇编二进制机器码 | 打印反汇编数据 )

    文章目录 一.反汇编二进制机器码 二.打印反汇编数据 一.反汇编二进制机器码 在创建 Capstone 实例对象 , 并设置 detail 属性为 True ; 在之前读取了 节区 二进制数据 , 这 ...

  6. 【Android 应用开发】Paint 滤镜原理 之 图像结构 ( 图片文件二进制分析 | PNG文件结构 | 数据块结构 | IHDR 数据块详解 )

    文章目录 图形文件准备 ( PNG 文件 ) PNG 文件信息分类 数据块结构 IHDR 数据块 简介 IHDR 数据块 结构 图形文件准备 ( PNG 文件 ) 分析的文件准备 : 1.创建文件 : ...

  7. C#中将list进行二进制序列化并保存数据到文件

    场景 将一个对象list进行二进制序列化并将数据写进文件. 实现 新建Winforn程序,然后拖拽两个Button. 第一个Button用来构建一个1000长度的list对象. 先声明一个全局的lis ...

  8. kaggle比赛数据_表格数据二进制分类:来自5个Kaggle比赛的所有技巧和窍门

    kaggle比赛数据 This article was originally written by Shahul ES and posted on the Neptune blog. 本文最初由 Sh ...

  9. Java使用get请求接收List集合数据(json)并导出报表

    Java使用get请求接收List集合数据(json)并导出报表 文章目录 Java使用get请求接收List集合数据(json)并导出报表 前言 一.实现分析 二.Maven依赖(基于EasyExc ...

  10. java学习笔记——springmvc 之 数据自定义转换器 数据格式化 JSR303数据校验返回与接收JSON(@RequestBody 和 @ResponseBody)

    九.数据绑定流程分析 1.提出问题 日期字符串格式的表单参数,提交后转换为Date类型 <!--    解决问题: 1.数据类型转换 2.数据格式 3.数据校验 --> BirthDay ...

最新文章

  1. asp.net 域名欺骗式开发
  2. 机器学习算法_五分钟了解机器学习十大算法
  3. flash_erase and flash_eraseall
  4. 图形驱动程序和显卡驱动什么区别_什么是核心显卡,核心显卡和集成显卡的区别...
  5. QT的QStateMachine类的使用
  6. MySQL前缀索引与覆盖索引:前缀索引对于索引精简 覆盖索引对于查询数据索引化
  7. android app links,Android APP Links 配置
  8. 新年就是要你红!华为Mate 20 Pro馥蕾红璨星蓝来袭
  9. 大意导致Java访问DB2库时导出SQLCODE=-301, SQLSTATE=07006错误
  10. windows server 2008R2下安装nginx
  11. 【优化模型】求非齐次线性方程组的通解
  12. PTA---计算天数
  13. [dlang](一)利用dub搭建vibe.d,hibernated,mysql开发环境
  14. 2021美赛写作(一)
  15. cad把图形切成两部分_CAD入门教程,最常用快捷键
  16. linux下使用tcpdump工具分析UDP报文
  17. Web前端学习笔记20:Vue_路由_Vue Router_模块化的分类_babel_webpack_Element-UI
  18. Qt多语言实现和动态切换(国际化)
  19. 2021新年算法小专题—2.股票买卖利润刷题(Java)
  20. 一份完整的ACSII码表

热门文章

  1. 内存溢出(OOM)及解决方案
  2. 淘汰安卓机废物利用(三) 网站服务器,安卓手机当服务器的方法,完成废物利用...
  3. 企业erp系统对企业预算和采购环节的作用
  4. 关于Java String类的理解
  5. 2023厦门大学计算机考研信息汇总
  6. 在不被限制的前提下,企业微信一天加多少好友(主动+被动)
  7. 完美解决Win11无法启动安全中心
  8. linux跟单片机的区别,树莓派和单片机的区别
  9. 现如今安卓手机的系统优化哪家好呢?
  10. 计算机宏如何设置方法,excel 如何启用宏的方法,以及如何设置excel启用宏