博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android Gson深入分析
阅读量:5024 次
发布时间:2019-06-12

本文共 7332 字,大约阅读时间需要 24 分钟。

眼下解析json有三种工具:org.json(Java经常使用的解析),fastjson(阿里巴巴project师开发的)。Gson(Google官网出的)。解析速度最快的是Gson,下载地址:

什么是JSON:

JSON即JavaScript Object Natation, 它是一种轻量级的数据交换格式, 与XML一样, 是广泛被採用的client和服务端交互的解决方式.

JSON对象: 

JSON中对象(Object)以"{"開始, 以"}"结束. 对象中的每个item都是一个key-value对, 表现为"key:value"的形式, key-value对之间使用逗号分隔. 如:{"name":"coolxing", "age"=24, "male":true, "address":{"street":"huiLongGuan", "city":"beijing", "country":"china"}}. JSON对象的key仅仅能是string类型的, 而value能够是string, number, false, true, null, Object对象甚至是array数组, 也就是说能够存在嵌套的情况.

JSON数组: 

JSON数组(array)以"["開始, 以"]"结束, 数组中的每个元素能够是string, number, false, true, null, Object对象甚至是array数组, 数组间的元素使用逗号分隔. 如["coolxing", 24, {"street":"huiLongGuan", "city":"beijing", "country":"china"}].

Gson的基本用法:

通过获取JsonReader对象解析JSON数据:

String jsonData = "[{\"username\":\"arthinking\",\"userId\":001},{\"username\":\"Jason\",\"userId\":002}]";try{	JsonReader reader = new JsonReader(new StringReader(jsonData));	reader.beginArray();	while(reader.hasNext()){		reader.beginObject();		while(reader.hasNext()){			String tagName = reader.nextName();			if(tagName.equals("username")){				System.out.println(reader.nextString());			}			else if(tagName.equals("userId")){				System.out.println(reader.nextString());			}		}		reader.endObject();	}	reader.endArray();}catch(Exception e){	e.printStackTrace();}

 

通过把JSON数据映射成一个对象,使用Gson对象的fromJson()方法获取一个对象数组进行操作:

创建JSON数据相应的一个POJO对象User.java:

public class User {	private String username ;	private int userId ;	public String getUsername() {		return username;	}	public void setUsername(String username) {		this.username = username;	}	public int getUserId() {		return userId;	}	public void setUserId(int userId) {		this.userId = userId;	}}

使用Gson对象获取User对象数据进行相应的操作:

Type listType = new TypeToken
>(){}.getType();Gson gson = new Gson();LinkedList
users = gson.fromJson(jsonData, listType);for (Iterator iterator = users.iterator(); iterator.hasNext();) { User user = (User) iterator.next(); System.out.println(user.getUsername()); System.out.println(user.getUserId());}

假设要处理的JSON字符串仅仅包括一个JSON对象。则能够直接使用fromJson获取一个User对象:

String jsonData = "{\"username\":\"arthinking\",\"userId\":001}";Gson gson = new Gson();User user = gson.fromJson(jsonData, User.class);System.out.println(user.getUsername());System.out.println(user.getUserId());
解析复杂实例:

数据格式:

{    "data": {        "partnerteamlist": [            {                "pteamId": 72825,                "ptitle": "随摄影/共6套服装/准爸准妈共拍/免费肚画/底片全送。

", "pteamprice": 288 }, { "pteamId": 72598, "ptitle": "随摄影/拍摄200张/4本相冊/品质拍摄/送全新婚纱。", "pteamprice": 2888 }, { "pteamId": 72613, "ptitle": "随摄影/送全新婚纱/多外景拍摄/服装不限数量/绝无二次消费。", "pteamprice": 3699 }, { "pteamId": 72638, "ptitle": "随摄影/服装不限数量/高品质拍摄260张/送全新婚纱。", "pteamprice": 4299 }, { "pteamId": 72716, "ptitle": "随摄影/3组服装造型/内外景拍摄/全然透明消费!

", "pteamprice": 388 } ], "liketeamlist": [ { "lteamId": 65886, "ltitle": "爱丽尔婚纱摄影/2本相冊/6套服装造型/拍摄不限最低拍摄150张。", "limage": "http://img.pztuan.com/upfile/team/2013/0712/201307120257551465.jpg", "lteamprice": 518, "lmarketprice": 3999 }, { "lteamId": 57133, "ltitle": "陶冶摄影/婚纱闺蜜/6组服装造型/拍摄不低于120张。", "limage": "http://img.pztuan.com/upfile/team/2013/0628/201306281115249737.jpg", "lteamprice": 580, "lmarketprice": 3380 } ], "feedbacks": { "feedbacklist": [ { "comment": "5分", "createtime": "2014.07.08 13:38", "score": 5, "username": "l***2" } ], "totalcount": 1, "totalscore": 5 } }, "err": null, "state": 1 }

实体类(里面的成员变量和接口的返回值名称一 一相应才干保证解析正确):

package com.pztuan.entity;import java.util.List;public class OtherDetail {	private int state;	private List
err; private OtherDetail2 data; public int getState() { return state; } public void setState(int state) { this.state = state; } public List
getErr() { return err; } public void setErr(List
err) { this.err = err; } public OtherDetail2 getData() { return data; } public void setData(OtherDetail2 data) { this.data = data; } public class OtherDetail2 { private List
partnerteamlist; private List
liketeamlist; private List
feedbacks; public List
getLiketeamlist() { return liketeamlist; } public void setLiketeamlist(List
liketeamlist) { this.liketeamlist = liketeamlist; } public List
getFeedbacks() { return feedbacks; } public void setFeedbacks(List
feedbacks) { this.feedbacks = feedbacks; } public class partnerteamlist { private int pteamId; private String ptitle; private Double pteamprice; public int getPteamId() { return pteamId; } public void setPteamId(int pteamId) { this.pteamId = pteamId; } public String getPtitle() { return ptitle; } public void setPtitle(String ptitle) { this.ptitle = ptitle; } public Double getPteamprice() { return pteamprice; } public void setPteamprice(Double pteamprice) { this.pteamprice = pteamprice; } } public class liketeamlist { private int lteamId; private String ltitle; private String limage; private Double lteamprice; private Double lmarketprice; public int getLteamId() { return lteamId; } public void setLteamId(int lteamId) { this.lteamId = lteamId; } public String getLtitle() { return ltitle; } public void setLtitle(String ltitle) { this.ltitle = ltitle; } public String getLimage() { return limage; } public void setLimage(String limage) { this.limage = limage; } public Double getLteamprice() { return lteamprice; } public void setLteamprice(Double lteamprice) { this.lteamprice = lteamprice; } public Double getLmarketprice() { return lmarketprice; } public void setLmarketprice(Double lmarketprice) { this.lmarketprice = lmarketprice; } } public class feedbacks { private int totalcount; private Double totalscore; private List
feedbacklist; public int getTotalcount() { return totalcount; } public void setTotalcount(int totalcount) { this.totalcount = totalcount; } public Double getTotalscore() { return totalscore; } public void setTotalscore(Double totalscore) { this.totalscore = totalscore; } public List
getFeedbacklist() { return feedbacklist; } public void setFeedbacklist(List
feedbacklist) { this.feedbacklist = feedbacklist; } public class feedbacklist { private String username; private String comment; private String createtime; private Double score; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getComment() { return comment; } public void setComment(String comment) { this.comment = comment; } public String getCreatetime() { return createtime; } public void setCreatetime(String createtime) { this.createtime = createtime; } public Double getScore() { return score; } public void setScore(Double score) { this.score = score; } } } public List
getPartnerteamlist() { return partnerteamlist; } public void setPartnerteamlist(List
partnerteamlist) { this.partnerteamlist = partnerteamlist; } } public class err { private int code; private String msg; public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } }}
注意上面内部类的运用。

解析:

Gson gson = new Gson();OtherDetail d = gson.fromJson(jsonString,Detail.class);//取值的时候就从父类一层一层调子类成员(重要)

若出现引用异常,请查看Java内部类设计原则。

如有问题请留言,转载注明出处。

參考:

           

转载于:https://www.cnblogs.com/blfshiye/p/5149243.html

你可能感兴趣的文章
Centos7下载和安装教程
查看>>
无谓的通宵加班之后的思索
查看>>
S1的小成果:MyKTV系统
查看>>
从setting文件导包
查看>>
编写一个函数isMerge,判断一个字符串str是否可以由其他两个字符串part1和part2“组合”而成...
查看>>
union和union all
查看>>
Github 开源:使用控制器操作 WinForm/WPF 控件( Sheng.Winform.Controls.Controller)
查看>>
PMD使用提醒
查看>>
Codeforces 887D Ratings and Reality Shows
查看>>
论文《A Generative Entity-Mention Model for Linking Entities with Knowledge Base》
查看>>
CentOS 6.7编译安装PHP 5.6
查看>>
Linux记录-salt分析
查看>>
Android Studio默认快捷键
查看>>
发布开源库到JCenter所遇到的一些问题记录
查看>>
第七周作业
查看>>
函数式编程与参数
查看>>
flush caches
查看>>
SSAS使用MDX生成脱机的多维数据集CUB文件
查看>>
ACM_hdu1102最小生成树练习
查看>>
MyBatis源码分析(一)--SqlSessionFactory的生成
查看>>