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的更多相关文章

  1. 《安卓网络编程》之第一篇 java环境下模拟客户端、服务器端

    1.Socket简介 在网络上的两个程序通过一个双向的通信连接实现数据的交换,这个双向链路的一端称为一个Socket.Socket通常用来实现客户方和服务方的连接.Socket是TCP/IP协议的一个 ...

  2. 《安卓网络编程》之第二篇 java环境下网络通信的综合应用

    经过前面内容的学习,我们了解了Java技术中实现网络通信的基本知识.下面将通过一个具体视力的实现过程,讲解客户端和服务器端通信的流程. 服务器端的实现文件是 Server.java,代码如下: imp ...

  3. 【Linux网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系

    [Linux网络编程]TCP网络编程中connect().listen()和accept()三者之间的关系 基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: conn ...

  4. 安卓网络编程学习(1)——java原生网络编程(1)

    写在前面 马上要进行第二轮冲刺,考虑到自己的APP在第一轮冲刺的效果不尽人意,有很多网络方面的小BUG,这里就系统学习一下网络编程,了解来龙去脉,以便更好的对项目进行优化处理. http协议 http ...

  5. Python高级网络编程系列之第一篇

    在上一篇中我们简单的说了一下Python中网络编程的基础知识(相关API就不解释了),其中还有什么细节的知识点没有进行说明,如什么是TCP/IP协议有几种状态,什么是TCP三次握手,什么是TCP四次握 ...

  6. [C# 网络编程系列]专题八:P2P编程

    引言: 前面的介绍专题中有朋友向我留言说介绍下关于P2P相关的内容的,首先本人对于C#网络编程也不是什么大牛,因为能力的关系,也只能把自己的一些学习过程和自己的一些学习过程中的理解和大家分享下的,下面 ...

  7. [C# 网络编程系列]专题三:自定义Web服务器

    转自:http://www.cnblogs.com/zhili/archive/2012/08/23/2652460.html 前言: 经过前面的专题中对网络层协议和HTTP协议的简单介绍相信大家对网 ...

  8. UNIX网络编程——使用select函数编写客户端和服务器

    首先看原先<UNIX网络编程--并发服务器(TCP)>的代码,服务器代码serv.c: #include<stdio.h> #include<sys/types.h> ...

  9. 【Linux 网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系

    基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: connect()函数:对于客户端的 connect() 函数,该函数的功能为客户端主动连接服务器,建立连接是通过三 ...

随机推荐

  1. 性能测试培训: 监控CPU之python

    性能测试培训: 监控CPU之python 作为一名测试开发工程师,开发脚本是为了测试服务的,我们在手里没有性能监控工具的情况下,我们会自己来进行开发脚本完成监控任务.下面是python监控cpu '' ...

  2. 翻译一篇文章:It's Difficult to Grow a Test Developer(成为测试开发工程师的艰辛)

    翻译一篇文章:It's Difficult to Grow a Test Developer(成为测试开发工程师的艰辛)   以下文章是送给来poptest学习测试开发工程师的学员们,很多人想测试工程 ...

  3. word-wrap: break-word;与word-break: break-all;文本自动换行

    word-break:break-all和word-wrap:break-word都是能使其容器如DIV的内容自动换行它们的区别就在于:1,word-break:break-all 例如div宽200 ...

  4. java实现截屏

    import java.awt.Dimension; import java.awt.Rectangle; import java.awt.Robot; import java.awt.Toolkit ...

  5. 性能优化之AJAX

    明天就放假啦~哈哈.四月份好像还没有输出呢,吓得我赶紧写点东西... Ajax是高性能JavaScript的基础. Ajax,从最基本的层面来说,是一种与服务器通信而无需重载页面的方法.数据可以从服务 ...

  6. 线上分享会.net框架“ABP”分享会总结

    前言 为了能够帮助.Net开发者开拓视野,更好的把最新的技术应用到工作中,我在3月底受邀到如鹏网.net训练营直播间为各位学弟学妹们进行ABP框架的直播分享.同时为了让更多的.NET开发者了解ABP框 ...

  7. 卷积神经网络CNN与深度学习常用框架的介绍与使用

    一.神经网络为什么比传统的分类器好 1.传统的分类器有 LR(逻辑斯特回归) 或者 linear SVM ,多用来做线性分割,假如所有的样本可以看做一个个点,如下图,有蓝色的点和绿色的点,传统的分类器 ...

  8. 财付通API

    开发财付通API的步骤: 1.首先开发财付通API时先获取商户号和密钥: 财付通测试号:商户号String partner = "1900000109";密钥String key ...

  9. c标签和foreach循环不能加载

    需要同时导入2个包: jstl.jar和standard.jar(大多数时候只会注意到jstl包,而忽视了standard包) 代码: c标签的写法 <%@ taglib prefix=&quo ...

  10. js的几大数据类型

    一. js的几大数据类型 数字:浮点数(3.14)+整数(1): 字符串:包括由任意数量字符组成的序列,例如:'a','one': 布尔值:true+false: undefined:当我们试图访问一 ...