通信设计:利用java的socket发送json

JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

其本质还是key-value的键值对,如:

"name":"yoman"

可细分为json数组和json对象,如:

{"Name": "bill", "age": "15"}//是一个对象
"people":[        
	{"Name": "KOS","age":"16"},
	{"Name":"LOGEN","age":"13"}
]//是一个数组

这种简单易懂的组织形式,使得其很适合作为一种消息在网络间传输,相比其他自定义格式的消息格式,更易懂和便于解析,但缺点也是有的,由于文本中加入了key,因此实际上有大量的重复文本被发送,就使得流量变大。

Anyway,我们经常使用socket发送一些诸如String的内容,查看源码,其实JsonObject本质上就是一个字符串,因此利用socket来发送它,也是能够很简单就能实现的。


1.首先,需要到官方获取org.json.jar包的内容:

https://github.com/stleary/JSON-java


在此之前,如果你对socket及输入输出流不甚了解,可以到这里看看。

Android TCP通信的简单实例以及常见问题[超时/主线程阻塞]


2.构建一个json对象并发送(此处采用BufferedWriter

JSONObject jsout = new JSONObject();
jsout.put("id",111);
jsout.put("msg","发送消息");
out.write(jsout.toString()+"\n");//注意需要一个换行符,否则多个数据包会粘粘到一起去
out.flush();


*事实上JSONObject的构建有很多方法,如直接建立一个Map,然后new JSONObject(map);可以参考JSONObject.java


3.接收并解析:(BufferedReader)

if(in.ready()){
	System.out.println("Log: Watiing Json Message");
	String readIn=in.readLine();
	System.out.println("Log: "+TCPip+":"+TCPport+" SendMsg:\n"+readIn);
					
	JSONObject js = new JSONObject(readIn);
	System.out.println("id="+js.get("id"));
	System.out.println("msg="+js.get("msg"));
}

*同样,此处的JSONObject的构建是直接从一个String构建的,也可以在getBytes后通过一个Byte[]来构建。

4.子对象:

需要注意的是,如果一个Json对象里有个子对象如:

"people":{       
	"man":{"Name": "KOS",
		   "lastName":"16"
	},//子对象
	"women":{"Name":"LOGEN",
		     "lastName":"13"
	}//子对象
}
那么在获取KOS的名字时,要这么写:
JSONObject sup = new JSONObject(readIn);
JSONObject sub =sup.getJSONObject("man");
sub.get("name");
*更多参见JSONObject.java


参考资料:

什么是json:

http://www.json.org/

你可能感兴趣的:(JAVA,设计,架构,开发模式,网站,服务器,网络,通信)