《安卓网络编程》之第八篇 安卓与服务器之间通讯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();
}
《安卓网络编程》之第八篇 安卓与服务器之间通讯JSON的更多相关文章
- 《安卓网络编程》之第一篇 java环境下模拟客户端、服务器端
1.Socket简介 在网络上的两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一端称为一个Socket.Socket通常用来实现客户方和服务方的连接.Socket是TCP/IP协议的一个 ...
- 《安卓网络编程》之第二篇 java环境下网络通信的综合应用
经过前面内容的学习,我们了解了Java技术中实现网络通信的基本知识.下面将通过一个具体视力的实现过程,讲解客户端和服务器端通信的流程. 服务器端的实现文件是 Server.java,代码如下: imp ...
- 【Linux网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系
[Linux网络编程]TCP网络编程中connect().listen()和accept()三者之间的关系 基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: conn ...
- 安卓网络编程学习(1)——java原生网络编程(1)
写在前面 马上要进行第二轮冲刺,考虑到自己的APP在第一轮冲刺的效果不尽人意,有很多网络方面的小BUG,这里就系统学习一下网络编程,了解来龙去脉,以便更好的对项目进行优化处理. http协议 http ...
- Python高级网络编程系列之第一篇
在上一篇中我们简单的说了一下Python中网络编程的基础知识(相关API就不解释了),其中还有什么细节的知识点没有进行说明,如什么是TCP/IP协议有几种状态,什么是TCP三次握手,什么是TCP四次握 ...
- [C# 网络编程系列]专题八:P2P编程
引言: 前面的介绍专题中有朋友向我留言说介绍下关于P2P相关的内容的,首先本人对于C#网络编程也不是什么大牛,因为能力的关系,也只能把自己的一些学习过程和自己的一些学习过程中的理解和大家分享下的,下面 ...
- [C# 网络编程系列]专题三:自定义Web服务器
转自:http://www.cnblogs.com/zhili/archive/2012/08/23/2652460.html 前言: 经过前面的专题中对网络层协议和HTTP协议的简单介绍相信大家对网 ...
- UNIX网络编程——使用select函数编写客户端和服务器
首先看原先<UNIX网络编程--并发服务器(TCP)>的代码,服务器代码serv.c: #include<stdio.h> #include<sys/types.h> ...
- 【Linux 网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系
基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: connect()函数:对于客户端的 connect() 函数,该函数的功能为客户端主动连接服务器,建立连接是通过三 ...
随机推荐
- webpack快速掌握教程
转载http://yijiebuyi.com/blog/46fb97b11fb8f4055e0b04d1cecb1f69.html #为什么用webpack 如果我们 前端 javascript 能像 ...
- Java常用的八种排序算法与代码实现
1.直接插入排序 经常碰到这样一类排序问题:把新的数据插入到已经排好的数据列中. 将第一个数和第二个数排序,然后构成一个有序序列 将第三个数插入进去,构成一个新的有序序列. 对第四个数.第五个数--直 ...
- 程序设计 之 C#实现《拼图游戏》 (下) 原理篇
前言:在 http://www.cnblogs.com/labixiaohei/p/6698887.html 程序设计 之 C#实现<拼图游戏>(上),上传了各模块代码,而在本文中将详细剖 ...
- 利刃 MVVMLight 6:命令基础
在MVVM Light框架中,事件是WPF应用程序中UI与后台代码进行交互的最主要方式,与传统方式不同,mvvm中主要通过绑定到命令来进行事件的处理, 因此要了解mvvm中处理事件的方式,就必须先熟悉 ...
- 【割点】【割边】tarjan
洛谷割点模板题--传送门 割边:在连通图中,删除了连通图的某条边后,图不再连通.这样的边被称为割边,也叫做桥.割点:在连通图中,删除了连通图的某个点以及与这个点相连的边后,图不再连通.这样的点被称为割 ...
- Linux学习---vi/vim命令
Vim是从 vi 发展出来的一个文本编辑器.代码补完.编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用. 所以本文直接用Vim编辑器 基本上 vi/vim 共分为三种模式,分别是命令模式( ...
- QT链接数据库
在介绍QT与数据的链接问题上,我在这里就不介绍关于QT环境与mysql.sqlite3环境的安装步骤了,以下的所有的操作都是建立在你已经安装了所有环境的基础上的.好的,那我们就具体来看一看QT环境中怎 ...
- PTA自测-3 数组元素循环右移问题
自测-3 数组元素循环右移问题 一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M≥0)个位置,即将A中的数据由(A0A1···AN-1)变换为 ...
- myeclipse离线安装PyDev
MyEclipse装好了,用来开发java web的,一直可以用,前几天用python写爬虫,也是在myeclipse下,离线安装的包.打开后配置了一下就可以了. 这里用的是PyDev2.8.2 ...
- CentOS 7安装Docker
在虚拟机CentOS 7上安装Docker ## 零:检查前提条件: 在Red Hat 和Red Hat系列的Linux发行版中,安装Docker所需的前提提交并不多. ### 1.内 ...