类似于xml,JSON也是一种轻量级的数据交换格式。但它体积更小,在网络上传输的时候可以更省流量。不足之处是JSON的语义性较差,没有xml那么直观。
JSON格式数据是一对一对的键值对,其构成规则如下图
例如:
1、(简单的JSON格式数据)
{"STS":"OK","ping":1428498902.938,"pong":1428498902.9698,"diff":0.031842947006226}
2、(带数组的JSON数据){"STS":"OK","ping":1428498902.938,"pong":1428498902.9698,"diff":0.031842947006226,data:[{"id":1,"name","Li"},{"id":2,"name","Wang"},{"id":3,"name","Sun"},{"id":4,"name","Ming"},"total":4]}
解析JSON的方法很多。大多需要引入第三方jar包来实现。
我这里采用的是android自带的api。
以完成登录这个过程为例:
public class TmpLogin { private String user; private String pass; private String lang; private String _c; private String _m; private JSONObject mJSONObject=new JSONObject(); public TmpLogin(String user1,String pass1,String lang1,String _c1,String _m1){ user=user1; pass=pass1; lang=lang1; _c=_c1; _m=_m1; } public JSONObject getTmpLogin() { try { mJSONObject.put("_c",_c); mJSONObject.put("_m",_m); JSONObject json = new JSONObject(); json.put("user", user); json.put("pass",pass); json.put("lang",lang); mJSONObject.put("_p",json); return mJSONObject; } catch (JSONException e){ e.printStackTrace(); } return null; } }这样我只要在需要这个JSON对象的位置实例化这个类并调用它的getTmpLogin()函数就可以获得想要的JSON对象。
如
函数:
private JSONObject getTmpLoginJsonObject(String user,String pwd,String lang){ TmpLogin tmpLogin=new TmpLogin(user,pwd,lang,"A","TmpLogin"); mjson= tmpLogin.getTmpLogin(); return mjson; }
public class HttpUtil { private static String TAG="sdfg"; public static String postJSONtoInternet(JSONObject mjsonobject,String url1){ try{ StringEntity se = new StringEntity( mjsonobject.toString()); HttpClient httpClient=new DefaultHttpClient(); // 连接超时 httpClient.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 5000); // 读取超时 httpClient.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT,5000); //创建一个HttpPost对象以发送post请求 HttpPost httpPost=new HttpPost(url1); httpPost.setEntity(se); HttpResponse httpResponse=httpClient.execute(httpPost); if(httpResponse.getStatusLine().getStatusCode()==200) {//验证服务器返回的状态码,等于200则表明请求和响应都成功了。但不代表登录成功 Log.d(TAG, "-----------------------200_----------->>>>>>"+"--------------200-----------------"); String result= EntityUtils.toString(httpResponse.getEntity()); Log.d(TAG, "-----------------------11_----------->>>>>>"+result); return result; } } catch (Exception e) { return null; /*e.printStackTrace();*/ } return null; } }这样通过参数传递,就能把我们生成的JSON对象发送给服务器并获取到服务器返回的数据
1)、简单的使用JSONObject的一个以string为参数的构造函数就可以实现转换。
JSONObject jsonObject =new JSONObject(result);
2)、使用getString()、optString()等函数对JSON进行解析
简单的,通过key来获取对应的值:
String STS=jsonObject.optString("STS");
String url=jsonObject.getString("url");
如果JSON中含有名字为table_data的数组:
JSONArray jsonArray = jsonObject.getJSONArray("table_data"); for(int i=0;i;i++) { JSONObject jsonObject2 = (JSONObject) jsonArray.opt(i); 。。。。。。 }