JSON是一种组织数据的结构模型(和XML类似),当需要在服务端和Android客户端之间传递大量字符串数据时,采用JSON往往比较高效。
服务端(核心代码):
byte[] jsonByte = polmanListStr.getBytes("GB2312");
DataOutputStream output = new DataOutputStream(socket.getOutputStream());
output.write(jsonByte);
System.out.println("发送的数据的长度:" + jsonByte.length);
System.out.println("-----------------------------------------");
output.flush();
socket.shutdownOutput();
这里的polmanListStr是javabean类型转换成json类型后的json字符串:
{"policelist":[{"name":"胡亮","phoneNumber":"456789","type":"协警"},{"name":"孙明","phoneNumber":"345678","type":"刑警"},{"name":"钱伟","phoneNumber":"234567","type":"民警"},{"name":"赵亮","phoneNumber":"123456","type":"民警"},{"name":"胡敏","phoneNumber":"567890","type":"协警"}]}
1、先将polmanListStr这个字符串转换成字节流:
//指定转换成字节流的编码格式:GB2312(Android默认的编码格式)
byte[] jsonByte = polmanListStr.getBytes("GB2312");
2、将得到的字节流写入socket的输出流传给Android客户端
DataOutputStream output = new DataOutputStream(socket.getOutputStream());
output.write(jsonByte);
Android客户端(核心代码):
updateSocket = new Socket(ip, port);
DataInputStream in = new DataInputStream(updateSocket.getInputStream());
ByteArrayOutputStream baos = new ByteArrayOutputStream();
String JsonStr = null;
byte[] by = new byte[2048];
int n;
while ((n = in.read(by)) != -1)
{
baos.write(by, 0, n);
}
JsonStr = new String(baos.toByteArray(),"GB2312");
JSONObject polListJsonObj = new JSONObject(JsonStr);
JSONArray polArray = polListJsonObj
.getJSONArray("policelist");
JSONObject jsonObj = polArray.getJSONObject(1);
PoliceMan policeman = new PoliceMan(
jsonObj.getString("name"),
jsonObj.getString("type"), jsonObj.getString("phoneNumber"));
1、先从socket输入流中得到从服务端传输过来的字节流:
DataInputStream in = new DataInputStream(updateSocket.getInputStream());
2、将得到的字节流读取出来,并写到字符串数组输出流中:
while ((n = in.read(by)) != -1)
{
baos.write(by, 0, n);
}
3、将字符串数组输出流转换成字符串:
//这里的编码格式和服务端的编码格式保持一致(GB2312)
JsonStr = new String(baos.toByteArray(),"GB2312");
最后得到的JsonStr 是服务端的polmanListStr一样的json字符串:
{"policelist":[{"name":"胡亮","phoneNumber":"456789","type":"协警"},{"name":"孙明","phoneNumber":"345678","type":"刑警"},{"name":"钱伟","phoneNumber":"234567","type":"民警"},{"name":"赵亮","phoneNumber":"123456","type":"民警"},{"name":"胡敏","phoneNumber":"567890","type":"协警"}]}
4、利用json字符串构建JSONObject:
//将得到的字符串转换化成了JSONObject,里面存放的是数组
JSONObject polListJsonObj = new JSONObject(JsonStr);
//得到JSONObject的数组
JSONArray polArray = polListJsonObj
.getJSONArray("policelist");
//取出数组中的JSONObject对象(这里取出的是第1个)
JSONObject jsonObj = polArray.getJSONObject(1);
5、利用JSONObject对象来构建JavaBean对象
//和map集合类似(key-value)
PoliceMan policeman = new PoliceMan(jsonObj.getString("name"), jsonObj.getString("type"), jsonObj.getString("phoneNumber"));
需要注意的地方
1、在服务端需要导入相应的JSON的jar包:
服务端:
2、Android客户端中自带有JSON的jar包:org.json.*。专门用来处理JSON数据。
如果需要额外导入第三方的JSON jar包,不要将这些第三jar包放在工程的libs文件夹下,这个文件夹是工程创建时自带的,当把第三方jar包复制到该文件夹下后就算导入到工程下了,在工程中可以使用:
这里的android-support-v4.jar就是android sdk已经给我们打包并提供给我们使用的jar包。存放在下面的位置下:
当需要使用第三方的JSON jar包时,我首先是将第三方的JSON jar包复制到libs文件夹下,但因为这个第三方的jar中定义的类和android sdk提供的类有重复,所以报出以下文件重复定义的错误:
[2015-04-09 10:26:31 - Dex Loader] Unable to execute dex: Multiple dex files define Lorg/apache/commons/collections/FastHashMap;
[2015-04-09 10:26:31 - MobileOA] Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files define Lorg/apache/commons/collections/FastHashMap;
这时,只需要在工程目录下另外新建一个文件夹(json),并把第三方JSON jar包复制到该文件夹下,然后右键工程导入第三方jar包。这样就能在程序中使用自己想要用的jar包了。
需要使用哪个就import哪一个就可以啦:
import net.sf.json.JSONArray;//这是导入的第三方jar包
import org.json.JSONArray;//这是系统默认的jar包
2、调用socket的shutdownOutput()和shutdownIutput()来关闭输入、输出流。如果调用输入、输出流的close()函数,会默认地关闭socket,导致通信中断。