数据交换格式主要分为纯文本格式,XML格式和JSON格式。其中纯文本格式是一种简单的,无格式的数据交换方式;而XML格式和JSON格式可以带有描述信息,它们叫做”自描述的“结构化文档。
JSON是一种轻量级的数据交换格式,所谓轻量级,是与XML文档结构相比而言的,描述项目的字符少,所以描述相同数据所需的字符个数要少,那么传输速度就会提高,流量就会减少。由于Web和移动平台开发对流量的要求是要尽可能少,对速度要求尽可能快,而轻量级的数据交换格式JSON就成为理想的数据交换格式。
构成JSON文档的两种结构为对象和数组。对象是”名称-值“对集合,它类似于Java中Map类型,而数组是一连串元素的集合。
下面是一个JSON对象的例子:
{
"name":"a.htm",
"size":345,
"saved":true
}
下面是一个JSON数组的例子:
["text","html","css"]
由于目前Java官方没有提供JSON编码和解码所需的类库,所以需要使用第三方JSON库,这里推荐使用JSON-java库。JSON-java库提供源代码,最重要的是不依赖于其他第三方库,不需要再去找其他的库。可以在https://github.com/stleary/JSON-java下载源码。
将JSON-java库源代码文件添加到工程中,需要两个步骤:
1.创建org.json包
JSON-java库中的源代码文件都隶属于org.json包。为此需要在Eclipse项目的src源代码文件夹中创建org.json包。
2.复制源代码文件
org.json包创建好后,需要将JSON-java库文件夹中的源代码文件复制到Eclipse工程的org.json包中。如下图所示:
案例:聊天工具
JSON和XML真正在进行数据交换的时候,它们存在的形式就是一个很长的字符串,这个字符串在网络中传输或者存储于磁盘等介质中。在传输和存储之前需要把JSON对象转换成为字符串才能传输和存储,这个过程称为”编码“过程。接收方需要将接收到的字符串转换成为JSON对象,这个过程称为”解码“过程。
为了进一步熟悉JSON数据交换格式,使用JSON进行数据交换来实现聊天工具。JSON格式内部结构是自定义的。代码如下:
{
"message":"hello",
"userid":"javaee",
"username":"二丢"
}
服务器端ChatServer代码如下:
package json;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
public class ChatServer {
public static void main(String[] args) {
System.out.println("服务器运行...");
Thread t=new Thread(()->{
try (
//创建一个ServerSocket监听端口8080客户请求
ServerSocket server=new ServerSocket(8080);
//使用accept()阻塞等待客户端请求
Socket socket=server.accept();
DataInputStream in=new DataInputStream(socket.getInputStream());
DataOutputStream out=new DataOutputStream(socket.getOutputStream());
BufferedReader keyboardIn=new BufferedReader(new InputStreamReader(System.in))
){
while(true)
{
/*接收数据*/
String str=in.readUTF();
//JSON解码
JSONObject jsonObject=new JSONObject(str);
//打印接收的数据
System.out.printf("从客户端接收的数据:%s\n",jsonObject);
/*发送数据*/
//读取键盘输入的字符串
String keyboardInputString=keyboardIn.readLine();
//结束聊天
if(keyboardInputString.equals("bye"))
{
break;
}
//编码
jsonObject=new JSONObject();
jsonObject.put("message", keyboardInputString);
jsonObject.put("userid", "acid");
jsonObject.put("username", "赵1");
//发送
out.writeUTF(jsonObject.toString());
out.flush();
}
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("服务器停止...");
});
t.start();
}
}
接收数据时对接收到的字符串进行解码,并返回JSON对象,注意要解码的字符串应该是有效的JSON字符串。
发送数据时需要创建JSON对象,并且添加JSON对象。代码中jsonObject.toString()语句是将JSON对象转换为JSON字符串。
客户端ChatClient代码如下:
package json;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.UnknownHostException;
public class ChatClient {
public static void main(String[] args) {
System.out.println("客户端运行...");
Thread t=new Thread(()->{
try(
//向127.0.0.1主机8080端口发出连接请求
Socket socket=new Socket("127.0.0.1",8080);
DataInputStream in=new DataInputStream(socket.getInputStream());
DataOutputStream out=new DataOutputStream(socket.getOutputStream());
BufferedReader keyboardIn=new BufferedReader(new InputStreamReader(System.in))
) {
while(true)
{
/*发送数据*/
//读取键盘输入的字符串
String keyboardInputString=keyboardIn.readLine();
//结束聊天
if(keyboardInputString.equals("bye"))
{
break;
}
JSONObject jsonObject=new JSONObject();
jsonObject.put("message", keyboardInputString);
jsonObject.put("userid", "javaee");
jsonObject.put("username", "二丢");
//发送
out.writeUTF(jsonObject.toString());
out.flush();
/*接收数据*/
String str=in.readUTF();
jsonObject=new JSONObject(str);
//打印接收的数据
System.out.printf("从服务器接收的数据:%s\n", str);
}
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("客户端停止!");
});
t.start();
}
}