Android 之json解析
JSON(JavaScript Object Notation) 定义:字符串 键值对 解析方法有JSON,谷歌GSON,阿里巴巴FastJSON(推荐)
一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。
业内主流技术为其提供了完整的解决方案(有点类似于正则表达式,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换。
JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。

JSON解析JSON数据时的重要方法
(1)JSONObject:
这是系统中有关JSON定义的基本单元,其包含一对(Key/Value)数值。
它对外部(External:应用toString()方法输出的数值)调用的响应体现为一个标准的字符串(例如:{“JSON”: “Hello, World”},最外被大括号包裹,其中的Key和Value被冒号”:”分隔)。
其对于内部(Internal)行为的操作格式略微,例如:初始化一个JSONObject实例,引用内部的put()方法添加数值:new JSONObject().put(“JSON”, “Hello, World!”),在Key和Value之间是以逗号”,”分隔。
Value的类型包括:Boolean、JSONArray、JSONObject、Number、String或者默认值JSONObject.NULL object。
有两个不同的取值方法:
get(): 在确定数值存在的条件下使用,否则当无法检索到相关Key时,将会抛出一个Exception信息。
opt(): 这个方法相对比较灵活,当无法获取所指定数值时,将会返回一个默认数值,并不会抛出异常。
(2)JSONArray:
它代表一组有序的数值。将其转换为String输出(toString)所表现的形式是用方括号包裹,数值以逗号”,”分隔(例如:[value1,value2,value3],大家可以亲自利用简短的代码更加直观的了解其格式)。这个类的内部同样具有查询行为,get()和opt()两种方法都可以通过index索引返回指定的数值,put()方法用来添加或者替换数值。
同样这个类的value类型可以包括:Boolean、JSONArray、JSONObject、Number、String或者默认值JSONObject.NULL object。
(3)JSONStringer:
根据官方的解释,这个类可以帮助快速和便捷的创建JSONtext。其最大的优点在于可以减少由于格式的错误导致程序异常,引用这个类可以自动严格按照JSON语法规则(syntaxrules)创建JSON text。每个JSONStringer实体只能对应创建一个JSON text。
根据下边的实例来了解其它相关信息:String myString = new JSONStringer().object() .key("name").value("小猪") .endObject().toString();
String myString = new JSONStringer().object()
.key("name")
.value("小猪")
.endObject()
.toString();
结果是一组标准格式的JSON text:{"name" : "小猪"}
其中的.object()和.endObject()必须同时使用,是为了按照Object标准给数值添加边界。同样,针对数组也有一组标准的方法来生成边界.array()和.endArray()。

3.JsonService 将person对象返回不同数据类型,供JsonTools 生成json
person
JsonService
4.TestJson 测试JsonTools 是否可以正常将JsonService 中返回的各种类型转换成json格式的字符串
5.JsonAction servlet 响应客户端的action 首先实例化JsonService 对象 并在init()方法中初始化该对象 doget做dopost的内容,并完善dopost
客户端编写:
1.首先在清单文件中添加访问网络的授权
2.修改布局文件
3.为了访问服务器端数据,编写http工具类,将访问url返回的输入流转换成String返回
4.由于服务器端是将person对象按照不同的格式加工成json格式的字符串返回给客户端,而客户端需要将字符串解析出来还原成为一个相应格式的person对象,所以客户端也需要定义一个person类
5.重点编写json解析类JsonTools,完成解析,要求给方法一个key和一个json字符串,就按照要求还原出来
---------------------------------------
谷歌GSON技术

3.JsonService 不变
4.修改action 因为gson的方法没有key值,所以得去掉
就这样 修改就完成了
客户端编写:
1.首先还是网络授权、并导入第三包
2.布局文件添加按钮
3.http、person同上
4.gsonTools 由于服务器生成json的时候没有key,所以与jsonTools不一样 gson.fromJson(jsonString, cls);或者gson.fromJson(jsonString);
使用到了反射的概念,服务器端和客户端解析和逆解析的对象都是同样的对象(在这里是person),使用jsonTools解析对象的时候,需要指明返回的类型,
但是使用gsonTools则采用泛型,使得gsonTools成为一个工具类,即不论服务器端返回何种类型的对象,客户端只要知道返回的类型都能进行解析,不用知道传递什么类型,也不用返回既定的类型
T指的是通用泛型,可以指任意的数据类型
4.mainactivity
package com.android.gson; import java.util.List;
import java.util.Map; import com.android.gson.domain.Person;
import com.android.gson.gsonTools.GsonTools;
import com.android.gson.http.HttpUtils;
import com.example.android_05json_gson.R; import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button; public class MainActivity extends Activity implements OnClickListener{
private Button person, persons, liststring, listmap;
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
person = (Button) this.findViewById(R.id.person);
persons = (Button) this.findViewById(R.id.persons);
liststring = (Button) this.findViewById(R.id.liststring);
listmap = (Button) this.findViewById(R.id.listmap);
person.setOnClickListener(this);
persons.setOnClickListener(this);
liststring.setOnClickListener(this);
listmap.setOnClickListener(this);
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} @Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
} @Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.person:
String path = "http://122.206.79.193:8080/gsonProject/servlet/JsonAction?action_flag=person";
String jsonString = HttpUtils.getJsonContent(path);
Person person=GsonTools.getPerson(jsonString, Person.class);
Log.i(TAG, person.toString());
break;
case R.id.persons:
String path2 = "http://122.206.79.193:8080/gsonProject/servlet/JsonAction?action_flag=persons";
String jsonString2 = HttpUtils.getJsonContent(path2);
List<Person> list=GsonTools.getPersons(jsonString2, Person.class);
Log.i(TAG, list.toString());
break;
case R.id.liststring:
String path3 = "http://122.206.79.193:8080/gsonProject/servlet/JsonAction?action_flag=liststring";
String jsonString3 = HttpUtils.getJsonContent(path3);
List<String> list3=GsonTools.getList(jsonString3);
Log.i(TAG, list3.toString());
break;
case R.id.listmap:
String path4 = "http://122.206.79.193:8080/gsonProject/servlet/JsonAction?action_flag=listmap";
String jsonString4 = HttpUtils.getJsonContent(path4);
List<Map<String,Object>> list4=GsonTools.listKeyMaps(jsonString4);
Log.i(TAG, list4.toString());
break;
}
}
}
---------------------------------------
阿里巴巴FastJson技术
ØFastJson是一个Json处理工具包,包括“序列化”和“反序列化”两部分,它具备如下特征:速度最快,测试表明,fastjson具有极快的性能,超越任其他的Java Json parser。包括自称最快的JackJson。功能强大,完全支持Java Bean、集合、Map、日期、Enum,支持范型,支持自省。无依赖,能够直接运行在Java SE 5.0以上版本.支持Android。开源 (Apache 2.0)

返回List<Map<String, Object>>JJSON.parseObject(jsonString,new TypeReference<List<Map<String, Object>>>() {});
package com.android.gson.fastJsonTools;
import java.util.ArrayList;
import java.util.List;
import java.util.Map; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference; ;
public class FastJsonTools { public FastJsonTools() {
// TODO Auto-generated constructor stub
} /**
* @param <T>
* @param jsonString
* @param cls
* @return单条数据单个javabean
*/
public static <T> T getPerson(String jsonString, Class<T> cls) {
T t = null;
try {
t = JSON.parseObject(jsonString, cls);
} catch (Exception e) {
// TODO: handle exception
}
return t;
} /**
* 使用Gson进行解析 List<Person>
*
* @param <T>
* @param jsonString
* @param cls
* @return
*/
public static <T> List<T> getPersons(String jsonString, Class<T> cls) {
List<T> list = new ArrayList<T>();
try {
list = JSON.parseArray(jsonString, cls);
} catch (Exception e) {
}
return list;
} public static List<Map<String, Object>> listKeyMaps(String jsonString) {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
try {
list = JSON.parseObject(jsonString,
new TypeReference<List<Map<String, Object>>>() {
});
} catch (Exception e) {
// TODO: handle exception
}
return list;
}
}
三种方式的对比:
方式 | 是否提供服务器端jsonString的生成方法 | 客户端JsonTools中的方法 | |||
JSON | 是:JSONObject jsonObject = new JSONObject();
jsonObject.put(key, value); |
解析成单个对象:方法参数为key和jsonString
JSONObject jsonObject = new JSONObject(jsonString); 赋值之后 return对象; |
解析成List<对象>:方法参数为key和jsonString
JSONObject jsonObject = new JSONObject(jsonString); 遍历并 list.add(对象)之后,返回list |
解析成List<String>:方法参数为key和jsonString
JSONObject jsonObject = new JSONObject(jsonString); 遍历并 list.add(对象)之后,返回list |
解析成List<String> List<Map<String, Object>> :方法参数为key和jsonString JSONObject jsonObject = new JSONObject(jsonString); 遍历jsonObject2 并 list.add(map)之后,返回list |
谷歌GSON | 是:
Gson gson = new Gson(); |
解析成单个对象:方法参数为String jsonString, Class<T> cls
Gson gson = new Gson(); return t即可 |
解析成List<对象>:方法参数为key和jsonString方法参数为String jsonString, Class<T> cls
Gson gson = new Gson(); return list; |
解析成List<String>:方法参数为jsonString
Gson gson = new Gson(); return list; |
解析成List<Map<String, Object>>
Gson gson = new Gson(); return list; |
阿里巴巴FastJSON | 否 |
解析成单个对象:方法参数为String jsonString和 Class<T> cls t = JSON.parseObject(jsonString, cls); return t即可 |
解析成List<T> list = JSON.parseArray(jsonString, cls); return list; |
解析成List<Map<String, Object>>方法参数为String jsonString list = JSON.parseObject(jsonString, return list; |
Android 之json解析的更多相关文章
- Android之JSON解析
做个Android网络编程的同学一定对于JSON解析一点都不陌生,因为现在我们通过手机向服务器请求资源,服务器给我们返回的数据资源一般都是以JSON格式返回,当然还有一些通过XML格式返回,相对JSO ...
- Android项目--Json解析
在过去的一段时间里,我希望做一个天气的应用,但是由于老版的天气接口已经不能用了.只能更新到2014年3月4日. 不过有些东西,哪来学习一下,也是可以的. 比如:http://m.weather.com ...
- 浅谈Android项目----JSON解析(4种解析技术详解)
json简介 1.概念:json全称是javaScript object Notation,是一种并轻量级的数据交换格式. 2.特点: 1.本质就是具有特定格式的字符串 2.json完全独立于编程语言 ...
- Android 中Json解析的几种框架(Gson、Jackson、FastJson、LoganSquare)使用与对比
介绍 移动互联网产品与服务器端通信的数据格式,如果没有特殊的需求的话,一般选择使用JSON格式,Android系统也原生的提供了JSON解析的API,但是它的速度很慢,而且没有提供简介方便的接口来提高 ...
- android通用JSON解析
ackage cn.com.pcgroup.<a href="http://lib.csdn.net/base/15" class="replace_word&qu ...
- Android okHttp网络请求之Json解析
前言: 前面两篇文章介绍了基于okHttp的post.get请求,以及文件的上传下载,今天主要介绍一下如何和Json解析一起使用?如何才能提高开发效率? okHttp相关文章地址: Android o ...
- android json解析及简单例子
JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据 ...
- [Android]天气App 3 网络数据的请求和Json解析
Android客户端开发,不仅仅是在Android端开发,还需要有相应的后台服务支持,否则的话,客户端的数据就只能放到本地自己做处理.我认为的原生态的App就是对应服务端的Client.他能像浏览 ...
- JSON解析之——Android
JSON解析之——Android 一.google天气案例 之前xml学习中的google天气的例子非常形象,所以我们继续以google天气作为案例进行学习,下面是我从google官网下载下来的天气J ...
随机推荐
- spring boot 登录注册 demo (四) -- 体验小结
之前没有折腾过Spring,直接上来怼Spring Boot异常痛苦,参考着官网的guide(https://spring.io/guides)写了几个demo: spring boot 跑起来确是方 ...
- 【PHP】Sublime下PHP网站开发指南
Sublime下PHP网站开发指南 作者:白宁超 2017年3月16日11:03:17 摘要:随着单位开发项目的需求,关于政务办公多年来一直使用php开发管理平台.笔者早年asp开发经验算是有些帮助, ...
- Java web开发,在一个jsp里放太多java代码的后果,摘自 java web轻量级开发面试教程
现要做一个简单的登录页面,如果用户通过验证,会显示Welcome用户名的欢迎词,反之则返回登录页面让用户再次输入 这部分的完整代码是JSPDemo项目里的login.jsp,下面来分析一下关键代码. ...
- 《Java从入门到放弃》JavaSE入门篇:面向对象概念(入门版)
要知道什么是面向对象,你首先要有个对象吧,所以······没有对象的可以回家洗洗睡了· 好吧,前面是开玩笑,要说明什么是面向对象,我们还是先 例子: 小呆:"小傻,你今天早餐吃的什么?&qu ...
- iOS 微信支付流程详解
背景 自微信支付.支付宝支付入世以来,移动端的支付日渐火热.虚拟货币有取代实体货币的趋向(这句纯属扯淡,不用管),支付在app开发中是一项基本的功能,有必要去掌握.从难易程度上讲,不管是微信支付还是支 ...
- tween.js的使用
前面的话 TweenJS提供了一个简单但强大的渐变界面.它支持渐变的数字对象属性&CSS样式属性,并允许链接补间动画和行动结合起来,创造出复杂的序列.本文将详细介绍tween.js的使用 概述 ...
- 九度OJ 1013 开门人和关门人
#include <iostream> #include <string.h> #include <sstream> #include <math.h> ...
- MacOS下免密码ssh登陆
由于配置过程中需要频繁的进行ssh连接到开发服务器执行命令以及通过scp命令向服务器拷贝文件等依赖ssh连接的操作.所以,配置本地环境跟服务器之间的ssh免密码连接可以有效的提升工作效率. ...
- 201521123082 《Java程序设计》第13周学习总结
201521123082 <Java程序设计>第13周学习总结 标签(空格分隔): java 1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. ...
- 201521123106 《Java程序设计》第7周学习总结
1. 本章学习总结 2. 书面作业 Q1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 答: ArrayList的contains源代码为: public boo ...