Android客户端与服务器端交互数据之json解析。服务器端的工作就是将特定的数据类型转换为json字符串,然后客户端再将json字符串转换成原来的类型,所以json解析是跨平台数据格式转换的一个桥梁,
这里以最常用的对象类型,list包裹对象类型,list包裹String类型,以及list包裹Map对象类型4种情况为例简单介绍json的数据解析
一、首先服务器端将数据转换为json格式
1,首先建立一个Person对象类,后面就是将person对象转换为json格式
packagecom.zml.pojo;
/**
*@author郑明亮
*@Time:2016年2月2日下午10:35:05
*@version1.0
*/
publicclassPerson{
Stringname;
Stringsex;
StringQQ;
Stringcontact;
publicPerson(){
//TODOAuto-generatedconstructorstub
}
publicPerson(Stringname,Stringsex,StringqQ,Stringcontact){
super();
this.name=name;
this.sex=sex;
QQ=qQ;
this.contact=contact;
}
/**
*@returnthename
*/
publicStringgetName(){
returnname;
}
/**
*@paramname
*thenametoset
*/
publicvoidsetName(Stringname){
this.name=name;
}
/**
*@returnthesex
*/
publicStringgetSex(){
returnsex;
}
/**
*@paramsex
*thesextoset
*/
publicvoidsetSex(Stringsex){
this.sex=sex;
}
/**
*@returntheqQ
*/
publicStringgetQQ(){
returnQQ;
}
/**
*@paramqQ
*theqQtoset
*/
publicvoidsetQQ(StringqQ){
QQ=qQ;
}
/**
*@returnthecontact
*/
publicStringgetContact(){
returncontact;
}
/**
*@paramcontact
*thecontacttoset
*/
publicvoidsetContact(Stringcontact){
this.contact=contact;
}
/*
*(non-Javadoc)
*
*@seejava.lang.Object#toString()
*/
@Override
publicStringtoString(){
return"Person[name="+name+",sex="+sex+",QQ="+QQ
+",contact="+contact+"]";
}
}
2.我写了一个工具类,用来生成上述的四种类型的数据;
packagecom.zml.utils;
importjava.util.ArrayList;
importjava.util.HashMap;
importjava.util.List;
importjava.util.Map;
importcom.zml.pojo.Person;
/**
*用于生成四种类型的数据来测试json解析:
*①Person对象类型②List
③List④List<>>
*
*@author郑明亮
*@Time:2016年2月2日下午10:38:40
*@version1.0
*/
publicclassDataUtil{
publicstaticPersongetPerson(){
returnnewPerson("郑明亮","男","1072307340","15733100573");
}
publicstaticList
getPersons(){
List
list=newArrayList();
list.add(getPerson());
list.add(newPerson("张三","男","123456789","98765432"));
list.add(newPerson("李四","女","762348234","12312124324"));
returnlist;
}
publicstaticList
getStrings(){
Listlist=newArrayList();
list.add("郑明亮");
list.add("张三");
list.add("李四");
returnlist;
}
publicstaticList<>>getMaps(){
List<>>list=newArrayList<>>();
Map
map=newHashMap();
map.put("name","郑明亮");
map.put("blog","blog.csdn.net/zml_2015");
map.put("person",getPerson());
list.add(map);
returnlist;
}
}
packagecom.zml.utils;
importnet.sf.json.JSONObject;
/**
*@author郑明亮
*@Time:2016年2月2日上午12:18:38
*@version1.0
*/
publicclassJsonTools{
publicstaticStringcreateJsonString(Stringkey,Objectvalue){
JSONObjectjsonObject=newJSONObject();
jsonObject.put(key,value);
returnjsonObject.toString();
}
}
packagecom.zml.test;
importcom.zml.utils.DataUtil;
importcom.zml.utils.JsonTools;
/**
*@author郑明亮
*@Time:2016年2月2日上午12:27:29
*@version1.0
*/
publicclasstestjson{
publicstaticvoidmain(String[]args){
StringjsonString;
jsonString=JsonTools.createJsonString("person",DataUtil.getPerson());
System.out.println(jsonString);
jsonString=JsonTools.createJsonString("persons",DataUtil.getPersons());
System.out.println(jsonString);
jsonString=JsonTools.createJsonString("strings",DataUtil.getStrings());
System.out.println(jsonString);
jsonString=JsonTools.createJsonString("maps",DataUtil.getMaps());
System.out.println(jsonString);
}
}
5.测试成功后,建立Servlet类,以方便将json数据传输给客户端
packagecom.zml.test;
importjava.io.IOException;
importjava.io.PrintWriter;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importcom.zml.utils.JsonTools;
/**
*@author郑明亮
*@Time:2016年2月2日下午10:54:26
*@version1.0
*/
publicclassJsonServletextendsHttpServlet{
*Constructoroftheobject.
*/
publicJsonServlet(){
super();
}
/**
*Destructionoftheservlet.
*/
publicvoiddestroy(){
super.destroy();//Justputs"destroy"stringinlog
//Putyourcodehere
}
/**
*ThedoGetmethodoftheservlet.
*
*Thismethodiscalledwhenaformhasitstagvaluemethodequalstoget.
*
*@paramrequest
*therequestsendbytheclienttotheserver
*@paramresponse
*theresponsesendbytheservertotheclient
*@throwsServletException
*ifanerroroccurred
*@throwsIOException
*ifanerroroccurred
*/
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
this.doPost(request,response);
}
/**
*ThedoPostmethodoftheservlet.
*
*Thismethodiscalledwhenaformhasitstagvaluemethodequalsto
*post.
*
*@paramrequest
*therequestsendbytheclienttotheserver
*@paramresponse
*theresponsesendbytheservertotheclient
*@throwsServletException
*ifanerroroccurred
*@throwsIOException
*ifanerroroccurred
*/
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
response.setContentType("text/html;charset=utf-8");
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
PrintWriterout=response.getWriter();
StringactionString=request.getParameter("action");
if(actionString.equals("person")){
jsonString=JsonTools.createJsonString("person",DataUtil.getPerson());
}elseif(actionString.equals("persons")){
jsonString=JsonTools.createJsonString("persons",DataUtil.getPersons());
}elseif(actionString.equals("strings")){
jsonString=JsonTools.createJsonString("strings",DataUtil.getStrings());
}elseif(actionString.equals("maps")){
jsonString=JsonTools.createJsonString("maps",DataUtil.getMaps());
}
out.write(jsonString);
}
/**
*Initializationoftheservlet.
*
*@throwsServletException
*ifanerroroccurs
*/
publicvoidinit()throwsServletException{
//Putyourcodehere
}
}[page]
通过网址访问可得到的JSON数据:
二、客户端解析json数据
这里暂时只贴出重要的解析部分,
packagecom.zml.util;
importjava.util.ArrayList;
importjava.util.HashMap;
importjava.util.Iterator;
importjava.util.List;
importjava.util.Map;
importorg.json.JSONArray;
importorg.json.JSONException;
importorg.json.JSONObject;
importcom.zml.pojo.Person;
/**
*解析数据:将json字符串解析还原成原来的数据类型
*
*@author郑明亮
*@date2016-2-3上午12:11:57
*@version1.0
*/
publicclassJsonTools{
publicstaticPersongetPerson(Stringkey,StringjsonString){
Personperson=newPerson();
//将json字符串转换成json对象
try{
JSONObjectjsonObject=newJSONObject(jsonString);
//将json对象根据key(person),拿到对应的value(Person对象)值
JSONObjectjsonObject2=jsonObject.getJSONObject(key);
//将拿到的对象set到一个person对象中
person.setName(jsonObject2.getString("name"));
person.setSex(jsonObject2.getString("sex"));
person.setQQ(jsonObject2.getString("QQ"));
person.setContact(jsonObject2.getString("contact"));
}catch(JSONExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
returnperson;
}
publicstaticList
getPersons(Stringkey,StringjsonString){
JSONObjectjsonObject;
try{
jsonObject=newJSONObject(jsonString);
JSONArrayPersons=jsonObject.getJSONArray(key);
for(inti=0;i<>
Personperson=newPerson();
JSONObjectjsonObject2=Persons.getJSONObject(i);
person.setName(jsonObject2.getString("name"));
person.setSex(jsonObject2.getString("sex"));
person.setQQ(jsonObject2.getString("QQ"));
person.setContact(jsonObject2.getString("contact"));
list.add(person);
}
}catch(JSONExceptione){
//TODOAuto-generatedcatchblock
e.printStackTrace();
}
returnlist;
}
publicstaticListgetStrings(Stringkey,StringjsonString){
Listlist=newArrayList();
try{
JSONObjectjsonObject=newJSONObject(jsonString);
JSONArrayStringArray=jsonObject.getJSONArray(key);
for(inti=0;i<> Stringstr=StringArray.getString(i);
list.add(str);
}
}catch(Exceptione){
//TODO:handleexception
}
returnlist;
}
publicstaticList<>>getMaps(Stringkey,
StringjsonString){
List<>>list=newArrayList<>>();
try{
JSONObjectjsonObject=newJSONObject(jsonString);
JSONArraymapsArray=jsonObject.getJSONArray(key);
for(inti=0;i<>
JSONObjectjsonObject2=mapsArray.getJSONObject(i);
Mapmap=newHashMap();
//查看Map中的键值对的key值
Iteratoriterator=jsonObject2.keys();
while(iterator.hasNext()){
Stringjson_key=iterator.next();
Objectjson_value=jsonObject2.get(json_key);
if(json_value==null){
//当键值对中的value为空值时,将value置为空字符串;
json_value="";
}
map.put(json_key,json_value);
}
list.add(map);
}
}catch(Exceptione){
//TODO:handleexception
}
returnlist;
}
}
需要注意的是上述,客户端和服务器端虽然都用到了JSONObject类,但是引用的不是一个jar包中的内容哦;客户端的是引用的org.json.JSONObject;而服务器端引用的是net.sf.json.JSONObject;