Android解析Json数据之Gson解析
Gson是谷歌官方提供的解析json数据的工具类。json数据的解析能够使用JSONObject和JSONArray配合使用解析数据,可是这样的原始的方法对于小数据的解析还是有作用的,可是陪到了复杂数据的解析,就非常难完毕任务。
Gson这个java类库能够把java对象转换成JSON,也能够把JSON字符串转换成一个相等的java对象。
以下我们来看一下详细的Gsom解析数据的过程。首先我们在server端定义了四种数据:各自是Person对象,List<Person>。List<String>,List<Map<String,Object>>
public class JsonService {
public JsonService() {
// TODO Auto-generated constructor stub
}
public Person getPerson(){
Person person =new Person(1001,"呆呆","成都双流");
return person;
}
public List<Person> getlistperson(){
List<Person> list =new ArrayList<>();
Person person1 =new Person(1001, "哈哈", "广东");
Person person2 =new Person(1002, "呵呵", "成都");
list.add(person1);
list.add(person2);
return list;
}
public List<String> getListString(){
List<String> list =new ArrayList<>();
list.add("北京");
list.add("成都");
list.add("双流");
return list;
}
public List<Map<String, String>> getListMaps(){
List<Map<String, String>> list =new ArrayList<>();
Map<String, String> map1 =new HashMap<String, String>();
map1.put("id", "1001");
map1.put("name", "呆呆");
map1.put("address", "成都");
Map<String, String> map2 =new HashMap<String, String>();
map2.put("id", "1002");
map2.put("name", "好痒");
map2.put("address", "双流");
list.add(map1);
list.add(map2);
return list;
}
知道了server上的详细数据之后。我们新建一个Androidproject,定义四个button。分别实现对Person对象。List<Person>,List<String>,List<Map<String,Object>>的解析功能。详细的xml布局代码这里就不做演示,读者自行创建。
由于Gson是使用的第三方框架,所以我们须要在project项目的lib目录下导入对应的jar文件,这里我们使用的gson-2.2.1.jar。由于从server获取数据须要用到网络,我们须要在AndroidMainfest.xml文件里获取网络请求权限:
<uses-permission android:name="android.permission.INTERNET"/>
创建对应的Person类,类中包括了id、name、address的set/get方法,以及一个tostring方法还有构造函数。具体代码不做具体描写叙述。
想要获取网络上的数据,就须要一个网络訪问类,打开网络訪问连接获取详细的数据:(若对当中某些代码有疑惑能够查看上一篇XML文件解析,有详细的代码解释这里不做赘述)
public class HttpUtils {
public HttpUtils() {
}
public static String getJsonContent(String url_path) {
try {
//定义http的链接,设置链接时长为3s,使用get方法获取数据
URL url = new URL(url_path);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setConnectTimeout(3000);
connection.setRequestMethod("GET");
connection.setDoInput(true);
int code = connection.getResponseCode();
if (code == 200) {
return changeInputStrean(connection.getInputStream());
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
//把字符串从outputString流里面写入ByteArrayOutputStream中,转换成字节数组。在构建一个新的字符串
private static String changeInputStrean(InputStream inputStream) {
String jsonString = null;
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
int len = 0;
byte[] data = new byte[1024];
try {
while ((len = inputStream.read(data)) != -1) {
outputStream.write(data, 0, len);
}
jsonString = new String(outputStream.toByteArray());
} catch (IOException e) {
e.printStackTrace();
}
return jsonString;
}
}
全部东西准备就绪,接下来须要做的就是定义Gson的工具类了。在这里我们要明确的是server将详细的数据对象使用Gson转换成了Json字符串。那么client须要做的就是将json字符串还原成原来的对象,那么我们这里定义的Gson工具类,一定是要可以满足各种数据对象的。也就是说无论server传递什么样的对象。作为client仅仅须要知道对象的类型就行将对象还原,所以在这里我们使用了泛型T的方式来定于
public class GsonTools {
public GsonTools() {
}
//使用泛型,不须要知道server端返回的是什么对象。server端gson解析成字符串返回后。都会解析成原来的对象
/**
*
* @param jsonstring
* @param cls
* @param <T> server端的对象使用Gson解析成json字符串,client将json字符串解析还原成原来的对象,如想提取成工具
* 类,不管server端传递的是什么对象,client仅仅需知道对象类型就能够解析。因此在此使用泛型T
* @return
*/
public static <T> T getperson(String jsonstring, Class<T> cls) {
T t = null;
Gson gson = new Gson();
t = gson.fromJson(jsonstring, cls);
return t;
}
/**
* 使用Gson进行解析List<Person>对象
* TypeToken 官方提供的反射机制,详见api说明文档
*
*
* @param jsonstring
* @param cls
* @param <T>
* @return
*/
public static <T> List<T> getpersons(String jsonstring, Class<T> cls) {
List<T> list = new ArrayList<T>();
Gson gson = new Gson();
//TypeToken把对象T中属性的值通过反射机制映射出来。再从jsonstring字符串中取出来的值放进去
//TypeToken<List<T>>(){}.getType()该方法表示把jsonstring字符串里面的值取出来之后封装到list中,然后分别从T中取出全部的类型
list = gson.fromJson(jsonstring, new TypeToken<List<T>>() {
}.getType());
return list;
}
public static List<String> getList(String jsonString) {
List<String> list = new ArrayList<>();
Gson gson = new Gson();
list = gson.fromJson(jsonString, new TypeToken<List<String>>() {
}.getType());
return list;
}
public static List<Map<String, Object>> getlistmap(String jsonstring) {
List<Map<String, Object>> list = new ArrayList<>();
Gson gson = new Gson();
list = gson.fromJson(jsonstring, new TypeToken<List<Map<String, Object>>>() {
}.getType());
return list;
}
}
剩下的事情就是我们实现详细的点击事件的功能了,由于这里使用API的版本号不支持在主线程中訪问网络请求,这里为了方便起见,我就直接定义了一个线程进行訪问。在详细的代码实现过程中,大家能够依据须要使用不同的方法:
case R.id.gsonperson:
new Thread(){
@Override
public void run() {
String path5 ="http://192.168.199.247:8080/jsonProject1/JsonAction?
action_flag=person";
String jsonstring = HttpUtils.getJsonContent(path5);
Person person = GsonTools.getperson(jsonstring,Person.class);
Log.i(TAG,person.toString());
}
}.start();
break;
case R.id.gsonpersons:
new Thread(){
@Override
public void run() {
String path6 ="http://192.168.199.247:8080/jsonProject1/JsonAction?action_flag=persons";
String jsonstring = HttpUtils.getJsonContent(path6);
List<Person> list = GsonTools.getpersons(jsonstring, Person.class);
Log.i(TAG,list.toString());
}
}.start();
break;
case R.id.gsonliststring:
new Thread(){
@Override
public void run() {
String path7 ="http://192.168.199.247:8080/jsonProject1/JsonAction?action_flag=liststring";
String jsonstring = HttpUtils.getJsonContent(path7);
List<String> list = GsonTools.getList(jsonstring);
Log.i(TAG,list.toString());
}
}.start();
break;
case R.id.gsonlistmap:
new Thread(){
@Override
public void run() {
String path8 ="http://192.168.199.247:8080/jsonProject1/JsonAction?
action_flag=listmap";
String jsonstring = HttpUtils.getJsonContent(path8);
List<Map<String,Object>> list =GsonTools.getlistmap(jsonstring);
Log.i(TAG,list.toString());
}
}.start();
break;
}
这里仅仅是将关键代码写出,其余代码,能够自己补充!
谢谢大家。请尊重作者的劳动成果。如需转载,请附上转载链接!
Android解析Json数据之Gson解析的更多相关文章
- C# JavaScriptSerializer 解析Json数据(多方法解析Json 三)
准备工作: 1.添加引用System.Web.Extensions, 2..net3.5+版本都有,如果VS2010找不到,在这个文件夹找:C:\Program Files\Reference Ass ...
- Jackson 解析json数据之忽略解析字段注解@JsonIgnoreProperties
转自:http://blog.csdn.net/ngl272/article/details/70217104 以前解析json用的惯的就是Google的gson了,用惯了基本就用它了,一直也没发现什 ...
- [转]Jackson 解析json数据之忽略解析字段注解@JsonIgnoreProperties
以前解析json用的惯的就是Google的gson了,用惯了基本就用它了,一直也没发现什么大问题,因为都是解析简单的json数据.但是最近学习springboot,要解析一个比较复杂的json数据.就 ...
- Android中使用Gson解析JSON数据的两种方法
Json是一种类似于XML的通用数据交换格式,具有比XML更高的传输效率;本文将介绍两种方法解析JSON数据,需要的朋友可以参考下 Json是一种类似于XML的通用数据交换格式,具有比XML更高的 ...
- Android网络之数据解析----使用Google Gson解析Json数据
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...
- 我的Android进阶之旅------>解决Jackson、Gson解析Json数据时,Json数据中的Key为Java关键字时解析为null的问题
1.问题描述 首先,需要解析的Json数据类似于下面的格式,但是包含了Java关键字abstract: { ret: 0, msg: "normal return.", news: ...
- Android中使用Gson解析JSON数据
Android中使用Gson解析JSON数据 在Android中可以使用Gson解析JSON数据 首先,从 code.google.com/p/google-gson/downloads/list ...
- Android系列---JSON数据解析
您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态. 如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦 如果您对文章内 ...
- android基础---->JSON数据的解析
上篇博客,我们谈到了XML两种常用的解析技术,详细可以参见我的博客(android基础---->XMl数据的解析).网络传输另外一种数据格式JSON就是我们今天要讲的,它是比XML体积更小的数据 ...
随机推荐
- 隐匿攻击-ICMP
ICMP隐蔽隧道从入门到精通 概述 众所周知传统socket隧道已极少,tcp.upd大量被防御系统拦截,dns.icmp.http/https等难于禁止的协议(当然还有各种xx over dns/i ...
- Python学习-day14-前台总结
以下博客为转载 http://www.cnblogs.com/evilliu/p/5760232.html HTML和CSS总结 一:针对上节作业: 1:
- ThinkPHP5 连接 PostgreSQL
$request = Db::connect( [ 'type' => 'pgsql', 'hostname' => '127.0.0.1', 'database' => 'keyw ...
- linux VIM编辑器常用指令
一般模式 查看文本-移动光标 [Ctrl] + [f] 屏幕『向前』移动一页 [Ctrl] + [b] 屏幕『向后』移动一页 n<space> 按下数字后再按空格键,光标会向右移动这一 ...
- HDU 5884 Sort(二分答案+计算WPL的技巧)
Sort Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- 【EX_BSGS】BZOJ1467 Pku3243 clever Y
1467: Pku3243 clever Y Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 425 Solved: 238[Submit][Status ...
- 洛谷P3832 [NOI2017]蚯蚓排队 【链表 + 字符串hash】
题目链接 洛谷P3832 题解 字符串哈希然后丢到hash表里边查询即可 因为\(k \le 50\),1.2操作就暴力维护一下 经复杂度分析会发现直接这样暴力维护是对的 一开始自然溢出WA了,还以为 ...
- KM算法【带权二分图完美匹配】
先orz litble--KM算法 为什么要用KM算法 因为有的题丧心病狂卡费用流 KM算法相比于费用流来说,具有更高的效率. 算法流程 我们给每一个点设一个期望值[可行顶标] 对于左边的点来说,就是 ...
- 论文笔记《ImageNet Classification with Deep Convolutional Neural Network》
一.摘要 了解CNN必读的一篇论文,有些东西还是可以了解的. 二.结构 1. Relu的好处: 1.在训练时间上,比tanh和sigmod快,而且BP的时候求导也很容易 2.因为是非饱和函数,所以基本 ...
- python 读取文件夹下的图片进行处理
python的os模块中有一个listdir函数可以遍历读取文件夹下的文件. import os for filename in os.listdir(r"./file"): #l ...