javajson转⼆进制数据_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 deBase64(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 = ad(buffer)) != -1) {
baos.write(buffer, 0, len);
}
data = ByteArray() ;
} 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 压缩后的数据
*/
python怎么读取json文件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 = ByteArray() ;
} 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,估计没⼏⾏就能搞定了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论