【Java】JSON数据交换格式及其使用案例(聊天工具)

数据交换格式主要分为纯文本格式,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();
	}

}

猜你喜欢

转载自blog.csdn.net/shimadear/article/details/88045263