admin 管理员组文章数量: 1086019
2024年12月27日发(作者:access union用法)
JSON三种数据解析方法
引言
JSON数据现在是我们开发中用的最多的,
百分之八十的数据都是通过JSON方式进行传
输,那么想要学好JSON解析就要了解什么是
JSON数据,怎么快速解析它从而提升开发效
率。
什么是JSON数据?
•
先看下面,这里有一段JSON数据,我们根据这段数进行讲解:
{
"paramz": {
"feeds": [
{
"id": 299076,
"oid": 288340,
"category": "article",
"data": {
"subject": "荔枝新闻3.0:不止是阅读",
"summary": "江苏广电旗下资讯类手机应用“荔枝新闻”于近期
推出全新升级换代的3.0版。",
"cover":
"/Attachs/Article/288340/3e8e2c397c70469f8845fad73aa38165
_",
"pic": "",
"format": "txt",
"changed": "2015-09-22 16:01:41"
}
}
],
"PageIndex": 1,
"PageSize": 20,
"TotalCount": 53521,
"TotalPage": 2677
}
}
•
其实JSON数据就是一段字符串而已,只不过有不同意义的分隔
符将其分割开来而已,我们看上面的符号,里面有[] ,{}等符号,其中
•
1 []中括号代表的是一个数组;
•
2 {}大括号代表的是一个对象
•
3 双引号“”表示的是属性值
•
4 冒号:代表的是前后之间的关系,冒号前面是属性的名称,后
面是属性的值,这个值可以是基本数据类型,也可以是引用数据类型。
了解了JSON数据的格式,怎么对这段数据进行解析呢?
1 JSONObject系统自带的解析方式解析,我们先来
JSONObject(系统自带的类)类中的方法:
•
上面用红框框出来的是我们手动解析最常用的方法了,好了,现
在我们想要解析上面的一段数据,该怎么做呢?这里我写了一个解析
类如下:
public class JsonUtils {
/**
* 根据json数据解析返回一个List
集合
* @param json json数据
* @return
*/
public static List
getJsonList(String json) {
List
dataList = new ArrayList<>();
try {
JSONObject rootObject = new JSONObject(json);
JSONObject
JSONArray
paramzObject
feedsArray
=
=
NObject("paramz");
NArray("feeds");
for (int i = 0; i < (); i++) {
JSONObject sonObject = NObject(i);
JSONObject dataObject = NObject("data");
String subjectStr = ing("subject");
String summaryStr = ing("summary");
String coverStr = ing("cover");
HashMap
("subject", subjectStr);
("summary", summaryStr);
("cover", coverStr);
(map);
}
return dataList;
} catch (JSONException e) {
tackTrace();
}
return null;
}
}
•
相信很简单一看就懂了吧,主要是比较费时间罢了,无非就是几
个方法不停的调用而已,所以显得特别的费时费力,下面我又写了一
个解析的方法,方法中会有一些冗余的代码,是为了更加深刻理解
JSON解析而写的,实际中可以删掉,也用了一行GSON解析,
GSON解析下面会见讲到:
•
其中DataModel对象我是将data对象使用GsonFormat插件
工具生成的,使用方式可以自行搜索
public class DataModel {
/**
* subject : "荔枝新闻3.0:不止是阅读"
* summary : "江苏广电旗下资讯类手机应用“荔枝新闻”于近期
推出全新升级换代的3.0版。"
*
_"
* pic :
* format : video
* changed : 2015-11-07 14:35:22
*/
public String subject;
public String summary;
public String cover;
public String pic;
public String format;
public String changed;
@Override
public String toString() {
return "DataModel{" +
"subject='" + subject + ''' +
", summary='" + summary + ''' +
", cover='" + cover + ''' +
cover :
"/Attachs/Article/288340/3e8e2c397c70469f8845fad73aa38165
", pic='" + pic + ''' +
", format='" + format + ''' +
", changed='" + changed + ''' +
'}';
}
}
/**
* 根据json对象获取List
* @param json 数据
* @return
*/
public static List
List
try {
JSONObject rootObject = new JSONObject(json);
JSONObject
/**
* JSONArray的构造方法获取JSONArray对象
*/
JSONArray jsonArray = new
JSONArray(ing("feeds"));
Log.i(TAG, "():"+());
/**
* 获取JSONObject对象的属性关键字
*/
Iterator
while (t()) {
paramzObject =
NObject("paramz");
Log.i(TAG, "iterators: " + ());
}
JSONArray feeds = NArray("feeds");
dataList = new ArrayList<>();
for (int i = 0; i < (); i++) {
JSONObject jsonObject = NObject(i);
DataModel model = new
new Gson().fromJson(ing("data"),
TypeToken
}.getType());
Log.i(TAG, "DataModel: " + ng());
(model);
}
return dataList;
} catch (JSONException e) {
// TODO Auto-generated catch block
tackTrace();
}
return null;
}
•
简单总结一下上面的解析吧:
•
1 对于JSONObject对象来说,想要得到一个JSONObject对
象通常可以通过
•
(a):构造方式:JSONObject(String json)-> JSONObject
getJSONObject(String
paramzObject
name){}->
=
rootObject = new JSONObject(json);
•
(b):JSONObject
JSONObject
NObject(“paramz”);
2 对于JSONArray对象来说,想要得到一个JSONArray对象通
常可以通过
(a):构造方式:JSONArray(String json)->JSONArray jsonArray
= new JSONArray(ing(“feeds”));
(b):JSONObject getJSONObject(String name){}-> JSONArray
feeds = NArray(“feeds”);
2 Gson解析
我们如果懂得了上面的手动解析方式的话,那么对于Gson解析而
言,就太简单了,下面我们就开始解析下面一段JSON数据:
{
"homeadlist": [
{
"id": 1,
"imgurl":
",
"jumpflag": 0,
"jumpurl": "",
"posflag": 1,
"remark": "1111",
"cityid": 1
},
{
"id": 12,
"imgurl":
",
"jumpflag": 0,
"jumpurl": "",
"posflag": 2,
"remark": "",
"cityid": 1
},
"/img/homead/eb442fbf-49db-4ba6-a102-
"/img/homead/a73b3f1d-0f14-429d-9d0f-
{
"id": 14,
"imgurl":
",
"jumpflag": 0,
"jumpurl": "/",
"posflag": 4,
"remark": "",
"cityid": 1
}
]
}
•
首先我们使用GsonFormat工具生成一个类HomeadListModel:
"/img/homead/68109460-635d-4c5c-8be8-
public class HomeadListModel {
/**
* code : 1
*
429d-9d0f-
","jumpflag":0,"jumpurl":"","posflag":1,"remark
":"1111","cityid":1},{"id":12,"imgurl":"/img/homead/eb442fbf-
49db-4ba6-a102-
","jumpflag":0,"jumpurl":"","posflag":2,"remark
":"","cityid":1},{"id":14,"imgurl":"/img/homead/68109460-635d-
4c5c-8be8-
","jumpflag":0,"jumpurl":"
/","posflag":4,"remark":"","cityid":1}]}
*/
data :
{"homeadlist":[{"id":1,"imgurl":"/img/homead/a73b3f1d-0f14-
public int code;
public DataBean data;
public static class DataBean {
public List
public static class HomeadlistBean {
public int id;
public String imgurl;
public int jumpflag;
public String jumpurl;
public int posflag;
public String remark;
public int cityid;
}
}
}
•
我们使用OKHttpClient,代码如下
r builder = new r();
Request request = new r()
.url(url)
.get()
.build();
().newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws
IOException {
Gson gson = new Gson();
/**
* lStateException: closed
* 因为OkHttp请求回调中().string()只能有效调
用一次
*
*/
String string = ().string();
Log.i("aaa", "response: " + string);
/**
* 重新构建一个response 因为().string()调用一
次之后流就断掉了,只能有效调用一次
*/
MediaType mediaType = ().contentType();
Response
string)).build();
String string1 = ().string();
Log.i("aaa", "response1: " + string1);
/**
* 将json数据转换为对象
*/
HomeadListModel
);
model = on(string1,
response1 =
lder().body((mediaType,
//HomeadListModel model2 = on(string1, new
TypeToken
}.getType());
/**
* 将对象转换为json数据
*/
String jsonString = (model);
Log.i("aaa", "onResponse2: " + jsonString);
for (listBean data :
list) {
(imageUrl + );
}
runOnUiThread(new Runnable() {
@Override
public void run() {
DataSetChanged();
}
});
}
});
•
我们想要将一个json数据转换为对象的话需要使用
fromJson(String json, Class classOfT) /fromJson(String json, Type
typeOfT),当我们需要将对象转换为String的时候根据String
toJson(Object src)方法即可。这里需要注意一点,如果
().string()调用大于一次的话,就会报错
lStateException:
个response;
3 FastJson解析
closed,因为因为
().string()调用一次之后流就断掉了,需要重新构建一
•
这个解析和Gson解析差不多,也是一行就搞定了,也是对上面
的Gson数据进行解析,想要将json数据解析成对象需要使用
parseObject()方法,参数可以传Class,也可以传Type;当需要通过对
象得到String字符串时候使用String json1 =
String(model)即可,下面贴上代码:
r builder = new r();
Request request = new r()
.url(url)
.get()
.build();
().newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws
IOException {
String json = ().string();
/**
* 根据json数据获取对象
*/
HomeadListModel model = bject(json,
new TypeToken
}.getType());
// HomeadListModel model2 =
bject(json, );
/**
* 根据对象获取json数据
*/
String json1 = String(model);
Log.i("aaa", "fastJson: " + json1);
for (listBean data :
list) {
(imageUrl + );
}
runOnUiThread(new Runnable() {
@Override
public void run() {
DataSetChanged();
}
});
}
});
结尾:上面写了三种解析JSON数据的方法,第一种是最麻烦的,
但是不一定是最差的,后面两种Gson和FastJson都是最常用的方法,
本博客里面用到的API也是最常用的API,基本开发都够用了,其余未
涉及到的请自行查看源码学习吧。(完)
Java泛型详解
版权声明:本文标题:JSON三种数据解析方法 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/p/1735334518a1649656.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论