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;

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 map = new 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 getGsonList(String json) {

List dataList;

try {

JSONObject rootObject = new JSONObject(json);

JSONObject

/**

* JSONArray的构造方法获取JSONArray对象

*/

JSONArray jsonArray = new

JSONArray(ing("feeds"));

Log.i(TAG, "():"+());

/**

* 获取JSONObject对象的属性关键字

*/

Iterator iterators = ();

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 homeadlist;

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泛型详解


本文标签: 解析 对象 数据 使用 需要