新应用的知识整理-通过JSON格式数据与服务器通信

一、JSON是什么?

类似于xml,JSON也是一种轻量级的数据交换格式。但它体积更小,在网络上传输的时候可以更省流量。不足之处是JSON的语义性较差,没有xml那么直观。

JSON格式数据是一对一对的键值对,其构成规则如下图

新应用的知识整理-通过JSON格式数据与服务器通信_第1张图片

例如:

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格式数据的生成与解析

解析JSON的方法很多。大多需要引入第三方jar包来实现。

我这里采用的是android自带的api。

以完成登录这个过程为例:

1、创建一个类用于生成需要的JSON对象

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;
}

2、通过http请求,与服务器通信(使用HttpClient)

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对象发送给服务器并获取到服务器返回的数据


3、将string类型转换为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);

    。。。。。。
}


 




你可能感兴趣的:(android)