zoukankan      html  css  js  c++  java
  • android之客户端与webservice的json方式交互


    数据传输量
    同等的数据,Json需要传输的数据更少,xml会相对多些,对关注数据量的机器来说,这点比较关键。

    扩展性,
    虽然xml打着可扩展的名号,但是还没有xml可以扩展,json不可以扩展的。

    编码难度
    xml跨平台对接更容易出问题,虽然工具很多,但是想在跨平台轻易的调通就不是很容易,而json手工就能写出来,编码就简单很多。

    解码难度
    这个我觉的json问题很大,特殊字符的处理让人很费心。xml,比如soap,一般不会有这个问题,只要考虑如何编码就可以了,很罕见遇到因为特殊字符导致无法解析的情况。

    那个更主流
    JSON,虽然解码有时会遇到问题,但是看起来更简洁和容易调试。

    另外推荐一个google的 protobuf,这个才是效率的王者,参考这里,google的很多服务都是用这个,包括google market.

    json是轻量级的,它易于使用,并且容易转换到Java对象;并且客户端脚本js容易获取,Android已经支持JSON的标准库。
    xml一般用在数据量很大的情况下或者数据结构复杂的时候一般用xml

    在Android开发中有一项非常广泛的应用:Android项目获取另一个web项目的资源或者返回的数据。
     
    本文获取web项目返回的JSON数据。Android应用解析JSON比XML性能要好,但有许多项目仍然采用的是XML。
     

    json

    21世纪初,Douglas Crockford寻找一种简便的数据交换格式,能够在服务器之间交换数据。当时通用的数据交换语言是XML,但是Douglas Crockford觉得XML的生成和解析都太麻烦,所以他提出了一种简化格式,也就是Json。

    Json的规格非常简单,只用一个页面几百个字就能说清楚,而且Douglas Crockford声称这个规格永远不必升级,因为该规定的都规定了。

    1) 并列的数据之间用逗号(",")分隔。

    2) 映射用冒号(":")表示。

    3) 并列数据的集合(数组)用方括号("[]")表示。

    4) 映射的集合(对象)用大括号("{}")表示。

    上面四条规则,就是Json格式的所有内容。

    比如,下面这句话:

    "北京市的面积为16800平方公里,常住人口1600万人。上海市的面积为6400平方公里,常住人口1800万。"

    写成json格式就是这样:

    [
    {"城市":"北京","面积":16800,"人口":1600},
    {"城市":"上海","面积":6400,"人口":1800}
    ]

    如果事先知道数据的结构,上面的写法还可以进一步简化:

    [
    ["北京",16800,1600],
    ["上海",6400,1800]
    ]


    java 定义示例: 

      private String jsonData1="[{\"name\":\"renhaili\",\"age\":20},{\"name\":\"zhouxiaodong\",\"age\":21}]";
      private String jsonData2="{\"name\":\"xiong\",\"age\":18}";

    由此可以看到,json非常易学易用。所以,在短短几年中,它就取代xml,成为了互联网上最受欢迎的数据交换格式。



    第一种方便简单:


    最近在用Android调用Web服务,开始准备用WebService来调用,用jws的WebService方式写好后发现Android调用的时候很多问题不知道咋解决了,后来发现有一个更好的办法,就是采用HttpPost来与后台交互。

    下面就说一下相关的JSON的操作:

     

    不得不说,JSON 格式的确是非常美妙的,速度快而且简化了很多操作
    在 Android 下,Android SDK 已经为我们封装好了整个与 JSON 有关的操作,使用非常方便

    以下就是一个标准的 JSON 请求的实现过程:

    HttpPost request = new HttpPost(url);
    // 先封装一个 JSON 对象
    JSONObject param = new JSONObject();
    param.put("name""rarnu");
    param.put("password""123456");
    // 绑定到请求 Entry
    StringEntity se = new StringEntity(param.toString()); 
    request.setEntity(se);
    // 发送请求
    HttpResponse httpResponse = new DefaultHttpClient().execute(request);
    // 得到应答的字符串,这也是一个 JSON 格式保存的数据
    String retSrc = EntityUtils.toString(httpResponse.getEntity());
    // 生成 JSON 对象
    JSONObject result = new JSONObject( retSrc);
    String token = result.get("token");



    第二种传统型的:



    package com.practice.json;

    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;

    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;

    public class JsonDemo extends Activity {
        /*
         * 解析JSON的例子,str保存的是JSON代码,解析后的数据在LogCat里输出
        */
        
        String TAG = "Json message";
        
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            detectJSON();
        }
        
        private void detectJSON() {
            String str = "{"+
            
              "\"日期\" : \"2011-06-06\","+

              //Like 是 JSONObject
              "\"Like\" : {"+
                "\"Name\" : \"加内特\","+
                "\"Height\" : \"2.11cm\","+
                "\"Age\" : 35"+
              "},"+
            
              //LikeList 就是一个 JSONObject
              "\"LikeList\":" +
                  "{\"List\": " +
                  "["+
                        //这里也是JSONObject
                      "{"+
                        "\"Name\" : \"Rose\","+
                        "\"Height\" : \"190cm\","+
                        "\"Age\" : 23"+
                      "},"+
                      //这里也是JSONObject
                      "{"+
                        "\"Name\" : \"科比\","+
                        "\"Height\" : \"198cm\","+
                        "\"Age\" : 33"+
                      "}"+
                  "]"+
                  "}"+
              "}";
            
            try {
                JSONObject dataJson = new JSONObject(str);
                Log.d(TAG, dataJson.getString("日期"));
                
                JSONObject nbaJson = dataJson.getJSONObject("Like");
            
                Log.d(TAG, nbaJson.getString("Name"));
                Log.d(TAG, nbaJson.getString("Height"));
                Log.d(TAG, nbaJson.get("Age").toString());
                
                JSONObject listJson = dataJson.getJSONObject("LikeList");
                JSONArray arrayJson = listJson.getJSONArray("List");
                
                for(int i=0;i<arrayJson.length();i++) {
                    
                    JSONObject tempJson = arrayJson.optJSONObject(i);
                    
                    Log.d(TAG, tempJson.getString("Name"));
                    Log.d(TAG, tempJson.getString("Height"));
                    Log.d(TAG, tempJson.getString("Age").toString());    
                }
                
                
            } catch (JSONException e) {
                System.out.println("Something wrong...");
                e.printStackTrace();
            }
        }
    }


  • 相关阅读:
    SQL SERVER将指定表中的指定字段按照(,)逗号分隔
    关于百度 UEditor的使用
    关于jquery的 $("form").serialize()和 new FormData表单序列化
    mvc5 + ef6 + autofac搭建项目(repository+uow)(二)
    (转载)[FFmpeg]使用ffmpeg从各种视频文件中直接截取视频图片
    sql查看数据库表使用情况
    EF FluentAPI映射一对多 关系时候报错
    (转载)Javascript 进阶 作用域 作用域链
    (转载)loadrunner简单使用——HTTP,WebService,Socket压力测试脚本编写
    [moka学习笔记]yii2.0 rules的用法(收集,不定期更新)
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3003938.html
Copyright © 2011-2022 走看看