JSON数据解析方法

Android 中一般网络请求都会以json或xml文件数据返回,其中json数据占大多数,所以学会json数据的解析对Android开发较为重要,

json数据解析一般分为三种。1:一般的json对象解析,2:阿里的fastjson解析,3:谷歌的gson解析,它们的优缺点我就不详细介绍了,以下是我对三种解析的使用,希望对大家有所帮助。

json解析无非分为三种,一种是json对象,一种json数组,另一种就是嵌套性的对象套数组。

1) 并列的数据之间用逗号(",")分隔。
2) 映射用冒号(":")表示。
3) 并列数据的集合(数组)用方括号("[]")表示。
4) 映射的集合(对象)用大括号("{}")表示。

例如:一般json的对象解析:

[
    {
        "name": "小三",
        "age": 20,
        "sex": true
    },
    {
        "name": "小亮",
        "age": 22,
        "sex": false
    }
]

代码如下:

public void parseJSONArray(String json) {
try {
JSONArray jsonArray = new JSONArray(json);
for (int i = 0; i < jsonArray.length(); i++) {
jsonObject = jsonArray.getJSONObject(i);
String name = jsonObject.getString("name");
int age = jsonObject.getInt("age");
boolean sex = jsonObject.getBoolean("sex");
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

复杂一点的json

{
    "buses": {
        "bus": [
            {
                "last_foot_dist": "0",
                "time": "37",
                "segments": {
                    "segment": [
                        {
                            "line_name": "立珊专线(中南大学学生公寓-长沙火车站)",
                            "foot_dist": "362",
                            "stat_xys": "",
                            "stats": "岳麓山南;湖南师大;二里半;岳麓山北;市四医院;华图教育(太平街口);牛耳教育(南阳街口);韭菜园;曙光路口;长岛路口;长沙火车站",
                            "end_stat": "长沙火车站",
                            "line_xys": "",
                            "line_dist": "7535",
                            "start_stat": "岳麓山南"
                        }
                    ]
                },
                "foot_dist": "362",
                "dist": "7897"
            }
        ]
    }
}


代码如下:

public List<Salution> parseJSON(String str){
     Log.d("返回的JSON数据:", str);
     List<Salution> busList = new ArrayList<Salution>();
  
     try {
JSONObject jsonObject = new JSONObject(str);
JSONObject busesJSON = jsonObject.getJSONObject("buses");
JSONArray busJSArray=busesJSON.getJSONArray("bus");
for(int i=0;i<busJSArray.length();i++){
JSONObject busJSObject = busJSArray.getJSONObject(i);
JSONObject segsJSObject=busJSObject.getJSONObject("segments");
JSONArray segJSArray=segsJSObject.getJSONArray("segment");
Salution st=new Salution();

for(int j=0;j<segJSArray.length();j++){
if(j==0){
JSONObject segJSObject = segJSArray.getJSONObject(j);
st.setLine_name1(segJSObject.getString("line_name"));
Log.d("line_name", segJSObject.getString("line_name"));
st.setStats1(segJSObject.getString("stats"));
st.setEnd_stat1(segJSObject.getString("end_stat"));
st.setStart_stat1(segJSObject.getString("start_stat"));
}
}

busList.add(st);
}
return busList;
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
     return null;
    }

如果是fasjson处理则方便很多,但是首先在项目中引入fastjson包,接着根据要解析的数据创建实体类,例如刚才的json格式

[
    {
        "name": "小三",
        "age": 20,
        "sex": true
    },
    {
        "name": "小亮",
        "age": 22,
        "sex": false
    }
]

只需要这样几步就行了


List<People> list  =new ArrayList<People>();

list = JSON.parseArray(data,Peopel.class);

复杂的json数据

{
    "buses": {
        "bus": [
            {
                "last_foot_dist": "0",
                "time": "37",
                "segments": {
                    "segment": [
                        {
                            "line_name": "立珊专线(中南大学学生公寓-长沙火车站)",
                            "foot_dist": "362",
                            "stat_xys": "",
                            "stats": "岳麓山南;湖南师大;二里半;岳麓山北;市四医院;华图教育(太平街口);牛耳教育(南阳街口);韭菜园;曙光路口;长岛路口;长沙火车站",
                            "end_stat": "长沙火车站",
                            "line_xys": "",
                            "line_dist": "7535",
                            "start_stat": "岳麓山南"
                        }
                    ]
                },
                "foot_dist": "362",
                "dist": "7897"
            }
        ]
    }
}

用fastjson解析为:

List<Bus> list  =new ArrayList<Bus>();

list = JSON.parseArray( JSON.parseObject(data.getString("buses").getString("bus")),Bus.class);这是对最外层,然后同样的道理可以对最内层解析

gson解析则为:

Type listType = new TypeToken<LinkedList<User>>(){}.getType();
Gson gson = new Gson();
LinkedList<User> 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());
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值