java json转二进制数据_Json二进制数据
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二进制数据相关推荐
- python json解析 超过对象_json序列化数据超出最大值(maxJsonLength)
标签: 1.序列化: 以下代码在对象过大时会报错:进行序列化或反序列化时出错.字符串的长度超过了为 maxJsonLength 属性设置的值. //jsonObj比较大的时候会报错 var seria ...
- java json传值到前台_json前后台传值
谈到JSON,简单的说就是一种数据交换格式.近年来,其在服务器之间交换数据的应用越来越广,相比XML其格式更简单.编解码更容易.扩展性更好,所以深受开发人员的喜爱. 下面简单的写一下在项目中前后台js ...
- java json不能正常解析_JSON格式正确,无法解析问题解决方法
解析的时候出JSONException:java.lang.String cannot be converted to JSONObject解决办法 在用org.json.JSONObject 解析从 ...
- Pandas载入数据(csv, JSON,XML,Excel,二进制数据,网页数据,数据库数据)
数据载入,存储及文件格式 这里用到的样本数据git地址:https://github.com/wesm/pydata-book 访问数据是使用各类工具所必须的第一步(获取数据).这里重点讨论使用pan ...
- 【Android 逆向】使用 Python 解析 ELF 文件 ( Capstone 反汇编 ELF 文件中的机器码数据 | 反汇编二进制机器码 | 打印反汇编数据 )
文章目录 一.反汇编二进制机器码 二.打印反汇编数据 一.反汇编二进制机器码 在创建 Capstone 实例对象 , 并设置 detail 属性为 True ; 在之前读取了 节区 二进制数据 , 这 ...
- 【Android 应用开发】Paint 滤镜原理 之 图像结构 ( 图片文件二进制分析 | PNG文件结构 | 数据块结构 | IHDR 数据块详解 )
文章目录 图形文件准备 ( PNG 文件 ) PNG 文件信息分类 数据块结构 IHDR 数据块 简介 IHDR 数据块 结构 图形文件准备 ( PNG 文件 ) 分析的文件准备 : 1.创建文件 : ...
- C#中将list进行二进制序列化并保存数据到文件
场景 将一个对象list进行二进制序列化并将数据写进文件. 实现 新建Winforn程序,然后拖拽两个Button. 第一个Button用来构建一个1000长度的list对象. 先声明一个全局的lis ...
- kaggle比赛数据_表格数据二进制分类:来自5个Kaggle比赛的所有技巧和窍门
kaggle比赛数据 This article was originally written by Shahul ES and posted on the Neptune blog. 本文最初由 Sh ...
- Java使用get请求接收List集合数据(json)并导出报表
Java使用get请求接收List集合数据(json)并导出报表 文章目录 Java使用get请求接收List集合数据(json)并导出报表 前言 一.实现分析 二.Maven依赖(基于EasyExc ...
- java学习笔记——springmvc 之 数据自定义转换器 数据格式化 JSR303数据校验返回与接收JSON(@RequestBody 和 @ResponseBody)
九.数据绑定流程分析 1.提出问题 日期字符串格式的表单参数,提交后转换为Date类型 <!-- 解决问题: 1.数据类型转换 2.数据格式 3.数据校验 --> BirthDay ...
最新文章
- asp.net 域名欺骗式开发
- 机器学习算法_五分钟了解机器学习十大算法
- flash_erase and flash_eraseall
- 图形驱动程序和显卡驱动什么区别_什么是核心显卡,核心显卡和集成显卡的区别...
- QT的QStateMachine类的使用
- MySQL前缀索引与覆盖索引:前缀索引对于索引精简 覆盖索引对于查询数据索引化
- android app links,Android APP Links 配置
- 新年就是要你红!华为Mate 20 Pro馥蕾红璨星蓝来袭
- 大意导致Java访问DB2库时导出SQLCODE=-301, SQLSTATE=07006错误
- windows server 2008R2下安装nginx
- 【优化模型】求非齐次线性方程组的通解
- PTA---计算天数
- [dlang](一)利用dub搭建vibe.d,hibernated,mysql开发环境
- 2021美赛写作(一)
- cad把图形切成两部分_CAD入门教程,最常用快捷键
- linux下使用tcpdump工具分析UDP报文
- Web前端学习笔记20:Vue_路由_Vue Router_模块化的分类_babel_webpack_Element-UI
- Qt多语言实现和动态切换(国际化)
- 2021新年算法小专题—2.股票买卖利润刷题(Java)
- 一份完整的ACSII码表