android JSON数据解析分析

来源:互联网 发布:南京大学软件学院硕士 编辑:程序博客网 时间:2024/05/16 17:29

android JSON数据解析分析

android开发中有大多数时间在和数据打交道,而JSON是目前移动端常用的数据类型,最近做了一个项目,要用到很多JSON数据,开始很是懵逼啊,看到JSON的数据后第一感觉是这特么是人写的JSON吗, 这特么的JSON结构,数组嵌套对象,对象在嵌套数组, 看了一会就有一个大大的懵逼,静下来认真的分析一下看看JSON的结构还是有迹可循的,下面分析一下我的思路

目录:

  • android JSON数据解析分析
    • 目录
    • 用到的工具
    • 解析思路
      • JSON格式如下
      • 格式化完后的格式
        • PS这里使用的是我自己本地的服务器所以JSON数据可能结构不是很合理but原理都是一样的不多解释
      • 分析步骤
      • JSON格式转换成JavaBean实体类
      • 装换成JavaBean实体类
        • 总结 每个JSONObject中的元素分为三种分别为 普通的字段 JSONObject对象和JSONArray对象 而字段转换成实体类对应的就是该实体类的一个变量 其变量的类型就是字段对应的类型 JSONObject和JSONArray装换成实体类对应的就是该实体类的一个List T 集合 该泛型就是根据其对象来定义的一个内部类 该内部类所拥有的属性就是JSONObject或者JSONArray所拥有的字段转换成其属性

用到的工具

1.HiJson ,用来格式化JSON数据格式,以便分析JSON的结构,创建JSON的实体类
2.JSON数据源, 用来解析测试的JSON对象
3.EditPlus , 可能从网络上请求的JSON的数据是乱码的, 这时候就可以用EditPlus来把乱码的转换成正常的编码格式

解析思路

  1. 先拿到JSON的数据, 然后在数据的编码格式转换成正常的编码格式, 一般为UTF-8, 不会转换格式的点击这里查看如何转换文字格式
    2.把拿到的JSON数据复制到HiJSON中, 点击标题栏里面的格式化便可把JSON数据格式化成目录格式的视图, 没有HiJSON的点击这里下载
  2. 格式化完毕就该分析其数据结构和对应的JavaBean实体类了

JSON格式如下

这是JSON数据的原始数据,没有格式化之前

{"retcode":200,"data":[{"id":10000,"title":"新闻","type":1,"children":[{"id":10007,"title":"北京","type":1,"url":"/10007/list_1.json"},{"id":10006,"title":"中国","type":1,"url":"/10006/list_1.json"},{"id":10008,"title":"国际","type":1,"url":"/10008/list_1.json"},{"id":10010,"title":"体育","type":1,"url":"/10010/list_1.json"},{"id":10091,"title":"生活","type":1,"url":"/10091/list_1.json"},{"id":10012,"title":"旅游","type":1,"url":"/10012/list_1.json"},{"id":10095,"title":"科技","type":1,"url":"/10095/list_1.json"},{"id":10009,"title":"军事","type":1,"url":"/10009/list_1.json"},{"id":10093,"title":"时尚","type":1,"url":"/10093/list_1.json"},{"id":10011,"title":"财经","type":1,"url":"/10011/list_1.json"},{"id":10094,"title":"育儿","type":1,"url":"/10094/list_1.json"},{"id":10105,"title":"汽车","type":1,"url":"/10105/list_1.json"}]},>>>

格式化完后的格式

这里只展开一部分,作为例子,其他的完全一样

...[]data    [0]        []children            [0]                "id":10007                "title":"北京"                "type":1                url:"/10007/list_1.json"            [1]            [2]            [3]            .            . 省略.....            .            [9]        id:10000;        title:"新闻"        type:1    [1]        "id":10002        "title":"专题"        "type":10        "url":/10006/list_1.json        "url1":/10007/list1_1.json...[]extend...retcode:200

PS这里使用的是我自己本地的服务器,所以JSON数据可能结构不是很合理,but原理都是一样的,不多解释,

分析步骤:

1.首先拿到的是整个JSONObject对象(不管里面有什么内容,其整个数据对象是属于JSONObject的),暂且叫做jsonStr;
2.jsonStr: jsonStr中的对象有三个对象分别是data, extend和retcode, 其中data和extend是有[ ]包括的,也就是属于JSONArray数组的, retcode是一个int类型的对象
3.date元素: data是一个JSON数组对象属于整个json数据的一个对象, 要想获得data对象就要调用整个json数据的对象的getJSONObject(String name)来获取,这里的name指的是要获取JSON数组的名字 代码如下:
JSONOArray dataArray = jsonStr.getJSONArray(data)
4.date的子元素: 从HiJSON工具的目录视图中可以看出data数组中的子元素都是一个数组对象, 所以就可以通过数组的遍历来获取每一个jsonArray中的JSONObject对象

for(int i = 0; i< dataArray.length();i++){    JSONObject object = dataArray.getJSONObject(i);}

JSON格式转换成JavaBean实体类:

还以上面的json数据为例子
1.这个JSON是新闻类客户端的JSON数据, 把这个JSON的实体类叫做TabNews
2.jsonStr里面的对象有三个,分别是data和extend数组, 和int类型的retcode对象
3.data里面的数据有4个子的数组元素每个子元素对应的是新闻的栏目, 有新闻, 专题, 组图, 互动四个栏目
4.以data的第一个子元素为例子分析:

a. data中有4个栏目的类型, 所以就data的上一级元素中创建一个List的集合来存放每一个data的元素, List的泛型要符合data里面子元素的内容, 这里起名叫做Menu
b.data的一个子元素里面包含了4个子元素,其中children为JSONArray类型, id, type和title为三个对应的元素标签
c.children数组有0-9个子对象, 每个对象为JSON数组, 每个对象中的json格式都是一样的, 内容如下:
"id": 10010,
"title": "体育",
"type": 1,
"url": "/10010/list_1.json"

装换成JavaBean实体类

1.首先是这个JavaBean实体类的名字, 要和json的数据内容行对应 以便于使用, 这里的是一个新闻类的并且有栏目, 和新闻分类等, 把这个实体类定义为TabNews
2,数组转换成类的时候对应的是一个List< T >集合的变量, 而一个字段对应的就是一个对应字段类型的变量,如: “id”:10007 , “title”:”北京”
这里的id对应的就是int类型的, title对应的就是String类型的

3.装换成代码就是如下:

public class TabNews{
public int retcode;
public List< Menu > data;
public List< Integer> extend;
//创建Menu内部类,对应的是data的4个直接子元素(数组类型的), Menu里面的属性就是4个子元素里面的字段的类型
public class Menu{
public int id;
public String title;
public int type;
public String url;
public String url1;
//这里是data第一个子元素里面对应的children的数组转换而来的
public List< TabItem > tabItem;
}
//data的第一个子元素是children的一个JSONArray, 里面对应的内容是一个新闻的类型, 这里创建一个TabItem类装载它
public class TabItem{
public int id;
public String title;
public int type;
public String url;
}
}

总结, 每个JSONObject中的元素分为三种,分别为: 普通的字段, JSONObject对象和JSONArray对象, 而字段转换成实体类对应的就是该实体类的一个变量, 其变量的类型就是字段对应的类型, JSONObject和JSONArray装换成实体类对应的就是该实体类的一个List< T > 集合, 该泛型就是根据其对象来定义的一个内部类, 该内部类所拥有的属性就是JSONObject或者JSONArray所拥有的字段转换成其属性,

注: 转换后属性的类型要和其字段的类型所匹配
第一次使用markdown编辑器, 用的很是生疏啊,好多格式调整,导致整篇文章格式布局有点乱, 这个编辑器和强大, 有空可以多学习一下


2 0
原创粉丝点击