zoukankan      html  css  js  c++  java
  • 《安卓网络编程》之第八篇 安卓与服务器之间通讯JSON

    JSON是什么?

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成(网络传输速度)。

    为什么使用JSON?

    先看一个简单的例子,假设客服端需要向服务器端请求数据:

    数据如果是一个单纯的对象,比如自定义的类User的一个实例

    package com.example.hixin;
    
    
    public class User{
        private String shenfennum;
        private String name;
        private String regtime;
        private String address;
        private String birthdate;
        
        public User(){
            
        }
        
        
        public String getShenfennum() {
            return shenfennum;
        }
    
        public void setShenfennum(String shenfennum) {
            this.shenfennum = shenfennum;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getRegtime() {
            return regtime;
        }
    
        public void setRegtime(String regtime) {
            this.regtime = regtime;
        }
    
        public String getAddress() {
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    
        public String getBirthdate() {
            return birthdate;
        }
    
        public void setBirthdate(String birthdate) {
            this.birthdate = birthdate;
        }
    
    
        @Override
        public String toString() {
            // TODO Auto-generated method stub
            return "User [shenfennum=" + shenfennum + ", name=" + name + ", regtime=" + regtime + ", address=" + address + ", birthdate=" + birthdate + "]";
        }
        
        
    }

    可以在发送的时候使用ObjectOutputStream,接受时使用ObjectInputStream。但这种直接发送对象

    的方式,虽然方便,但在使用的时候容易出现问题,对于ArrayList<User>这种复合对象基本上就不能考虑啦!

    再来看一个更复杂的情形:

    有这么一个需求,设备在验证登录成功之后,要从服务拉取所有使用此设备的用户,这个过程中,服务器要发送两种类型的数据。

    1、登录成功的响应:可以是一个整形数字,也可以是一个字符串“success”

    2、使用该设备的所有用户:ArrayList<User>

    客户端接受服务器返回的数据,接受到的本质上是一个流(inputStream),如何从一个流中解析出这两种数据。显然直接发送对象的方式不可能解决!

    这个时候就可以考虑JSON

    login!!![{"shenfennum":"412728199005233676","name":"boge","regtime":"2015-04-27 10:23:27","address":"河南省周口市","birthdate":"1990-05-23"},{"shenfennum":"412728199005233677","name":"bobe","regtime":"2015-04-27 10:23:27","address":"河南省周口市","birthdate":"1990-05-24"},{"shenfennum":"412728199005233678","name":"bobo","regtime":"2015-05-14 11:01:38","address":"河南省郑州市","birthdate":"2015-05-14"}]

      1、提问

    question!!!20num[{"label":"交通住宿","question_content":"在美国怎么打出租车"},{"label":"交通住宿","question_content":"在美国怎么打出租车"},{"label":"交通住宿","question_content":"在美国怎么打出租车"}]

    2、回答

    answer!!!15num[{"label":"交通住宿","question_content":"在美国怎么打出租车","answer_content":"两种方法:1、直接打一个本地区出租车公司的电话..."},

    {"label":"交通住宿","question_content":"在美国怎么打出租车","answer_content":"两种方法:1、直接打一个本地区出租车公司的电话..."},
    {"label":"交通住宿","question_content":"在美国怎么打出租车","answer_content":"两种方法:1、直接打一个本地区出租车公司的电话..."}
    ]

    再使用ArrayList时要这样定义:

     public List<User>  userList = new ArrayList<User>();

    不要这样:

     public ArrayList<User>  userList = new ArrayList<User>();

    下面这种在JSON解析时会遇到麻烦:

                            Gson gson = new Gson();
                                          
                                            Type type = new TypeToken<ArrayList<User>>(){}.getType();
                                            LinkedList<User> templist = new LinkedList<User>(); 
                                           
                                           // gson.fromJson 默认返回 LinkedList
                                            templist = gson.fromJson(s2, type);
                                            for (User suser : templist) { 
                                                app.userList.add(suser);
                                           }  

    最上面的那种定义就很简单:

                            Type type = new TypeToken<List<User>>(){}.getType();                                       
                                            app.userList = gson.fromJson(s2, type);                                                                             

    一次请求数据量过大时一定要使用分页技术

    select * from xueya2 limit 0,2

    select * from xueya2 limit 2,2

    JSON数据解析:

    String jsons = "{'Status':'success','num':2,'answers':[{'answer_content':'这是第一个回答','question_content':'这是一个测试,这里是内容','Tag':'1'},{'answer_content':'这是第二个回答','question_content':'这是一个测试,这里是内容','Tag':'1'}],'type':'answer'}";
            try {
                JSONObject jsonObject = new JSONObject(jsons);
                String num = jsonObject.getString("num");
                Log.i("num",num);
                String answers = jsonObject.getString("answers");
                JSONArray quesArray = new JSONArray(answers);
                for(int i=0; i< quesArray.length(); i++){
                    JSONObject quesObject = quesArray.getJSONObject(i);
                    String ans = quesObject.getString("answer_content");
                    Log.i("ans",ans);
                }
                
                
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
  • 相关阅读:
    一个面试问题的答案总结
    全局变量与局部变量的特点
    浮点数类型在内存当中是如何存储的
    常用的几种调用约定
    裸函数
    安卓活动的启动模式
    安卓的生命周期
    android中的内部存储与外部存储
    堆栈图学习汇编结束篇最后一个堆栈图的练习
    Android内部存储与外部存储的文件操作类
  • 原文地址:https://www.cnblogs.com/hixin/p/4487186.html
Copyright © 2011-2022 走看看