zoukankan      html  css  js  c++  java
  • android之解析json数据格式详解

    1.JSON解析
         (1).解析Object之一:

      解析方法:

    1JSONObject demoJson = newJSONObject(jsonString);
    2String url = demoJson.getString("url");

      (2).解析Object之二:

    1{"name":"android","name":"iphone"}

      解析方法:

    1JSONObject demoJson = newJSONObject(jsonString);
    2String name = demoJson.getString("name");
    3String version = demoJson.getString("version");
    4System.out.println("name:"+name+",version:"+version);

         (3).解析Array之一:

    1{"number":[1,2,3]}

       解析方法:

    1JSONObject demoJson = newJSONObject(jsonString);
    2JSONArray numberList = demoJson.getJSONArray("number");
    3for(int i=0; i<numberList.length(); i++){
    4    //因为数组中的类型为int,所以为getInt,其他getString,getLong同用
    5    System.out.println(numberList.getInt(i));
    6}

      (4).解析Array之二:

    1{"number":[[1],[2],[3]]}

      解析方法:

    1//嵌套数组遍历
    2JSONObject demoJson = newJSONObject(jsonString);
    3JSONArray numberList = demoJson.getJSONArray("number");
    4for(int i=0; i<numberList.length(); i++){
    5      //获取数组中的数组
    6      System.out.println(numberList.getJSONArray(i).getInt(0));
    7}

      (5).解析Object和Array:

    1{"mobile":[{"name":"android"},{"name":"iphone"}]}

      解析方法:

    1JSONObject demoJson = newJSONObject(jsonString);
    2JSONArray numberList = demoJson.getJSONArray("mobile");
    3for(int i=0; i<numberList.length(); i++){
    4      System.out.println(numberList.getJSONObject(i).getString("name"));
    5}

      所以,我们发现get后面接着的是你想要的得到的结果的类型:getType,这个对理解很有帮助。
         (6).使用optType:
         
    上面的例子,使用getType在碰到查找不到节点的时候,会抛出异常。
          如果使用optType,找不到节点,则返回null或者默认值。

    1//无url节点,抛出异常
    2String url = demoJson.getString("url");
    3//无url节点,返回空,如果为基本类型,则返回默认值
    4String url = demoJson.optString("url");

      (7).UTF-8的BOM头导致解析JSON异常的问题
          到json文件保存为utf-8的时候,在windows平台下,会产生bom头"EF BB EF"字节在文本的最前面(需要用十六进制工具打开才能看的到)。
          有两种解决方法:
          a.使用UltraEdit打开json文件, 另存为的时候,选择格式UTF-8,无BOM头,如果还不行,在用记事本打开,另存为UTF-8下,多试几次就可以了。
          b.使用代码处理,截取json主体内容:

    1String jsonString = getJsonString();
    2jsonString = jsonString.substring(jsonString.indexOf("{"),jsonString.lastIndexOf("}")+1);

    2.JSON必知
         (1).JSON是一种轻量级的数据交换格式
         (2).JSON基于两种数据结构:Object和Array。其中Object是“名称/值”对的集合。
         (3).对象:大括号,每一组string-value结合以","分隔,string和value以冒号分隔。
    android 解析json数据格式 - tuchengju - tuchengju的博客 
         (4).数组:
    android 解析json数据格式 - tuchengju - tuchengju的博客
         (5).string由双引号包围的任意数量Unicode字符的集合,使用反斜线转义。
    android 解析json数据格式 - tuchengju - tuchengju的博客
         (6).value可以是双引号括起来的字符串(string)、数值(number)、truefalse null、对象(object)或者数组(array)。这些结构可以嵌套。
    android 解析json数据格式 - tuchengju - tuchengju的博客
         (7).空白可以加入到任何符号之间,包括空格,tab,回车,换行等。
         (8).举例:
           a.Object实例:

    01{
    02     "Image": {
    03      "Width":  800,
    04      "Height": 600,
    05      "Title""View from 15th Floor",
    06      "Thumbnail": {
    07          "Url":   "http://www.example.com/image/481989943",
    08          "Height": 125,
    09          "Width""100"
    10      },
    11      "IDs": [116, 943, 234, 38793]
    12    }
    13}

             b.Array实例:

    01[
    02   {
    03      "precision":"zip",
    04      "Latitude":  37.7668,
    05      "Longitude": -122.3959,
    06      "Address":  "",
    07      "City":     "SAN FRANCISCO",
    08      "State":    "CA",
    09      "Zip":      "94107",
    10      "Country":  "US"
    11   },
    12   {
    13      "precision":"zip",
    14      "Latitude":  37.371991,
    15      "Longitude": -122.026020,
    16      "Address":  "",
    17      "City":     "SUNNYVALE",
    18      "State":    "CA",
    19      "Zip":      "94085",
    20      "Country":  "US"
    21   }
    22]

    3.小结
          很简单 ,很基础,积水方能成江,累砖才可筑楼。 

    接下来举两个实际的例子:
    一种是普通的,一种是带有数组形式的;
    普通形式的:
    服务器端返回的json数据格式如下:

    {
    "userbean":{"Uid":"100196","Showname":"疯狂的猴子","Avtar":null,"State":1}}

    分析代码如下:

    // TODO 状态处理 500 200 
                    int res = 0
                    res 
    = httpClient.execute(httpPost).getStatusLine().getStatusCode(); 
                    
    if (res == 200) { 
                        
    /* 
                         * 当返回码为200时,做处理 
                         * 得到服务器端返回json数据,并做处理 
                         * 
    */ 
                        HttpResponse httpResponse 
    = httpClient.execute(httpPost); 
                        StringBuilder builder 
    = new StringBuilder(); 
                        B?redReader b?redReader2 
    = new B?redReader( 
                                
    new InputStreamReader(httpResponse.getEntity().getContent())); 
                        String str2 
    = ""
                        
    for (String s = b?redReader2.readLine(); s != null; s = b?redReader2 
                                .readLine()) { 
                            builder.append(s); 
                        } 
                        Log.i(
    "cat"">>>>>>" + builder.toString());

    JSONObject jsonObject 
    = new JSONObject(builder.toString()) 
                            .getJSONObject(
    "userbean"); 

                    String Uid; 
                    String Showname; 
                    String Avtar; 
                    String State; 

                    Uid 
    = jsonObject.getString("Uid"); 
                    Showname 
    = jsonObject.getString("Showname"); 
                    Avtar 
    = jsonObject.getString("Avtar"); 
                    State 
    = jsonObject.getString("State");
    带数组形式的:
    服务器端返回的数据格式为:

    {
    "calendar"
        {
    "calendarlist"
                [ 
                {
    "calendar_id":"1705","title":"(亲子)ddssd","category_name":"默认分类","showtime":"1288927800","endshowtime":"1288931400","allDay":false}, 
                {
    "calendar_id":"1706","title":"(旅行)","category_name":"默认分类","showtime":"1288933200","endshowtime":"1288936800","allDay":false
                ] 
        } 
    }

    分析代码如下:

    // TODO 状态处理 500 200 
                    int res = 0
                    res 
    = httpClient.execute(httpPost).getStatusLine().getStatusCode(); 
                    
    if (res == 200) { 
                        
    /* 
                         * 当返回码为200时,做处理 
                         * 得到服务器端返回json数据,并做处理 
                         * 
    */ 
                        HttpResponse httpResponse 
    = httpClient.execute(httpPost); 
                        StringBuilder builder 
    = new StringBuilder(); 
                        B?redReader b?redReader2 
    = new B?redReader( 
                                
    new InputStreamReader(httpResponse.getEntity().getContent())); 
                        String str2 
    = ""
                        
    for (String s = b?redReader2.readLine(); s != null; s = b?redReader2 
                                .readLine()) { 
                            builder.append(s); 
                        } 
                        Log.i(
    "cat"">>>>>>" + builder.toString()); 
                        
    /** 
                         * 这里需要分析服务器回传的json格式数据, 
                         
    */ 
                        JSONObject jsonObject 
    = new JSONObject(builder.toString()) 
                                .getJSONObject(
    "calendar"); 
                        JSONArray jsonArray 
    = jsonObject.getJSONArray("calendarlist"); 
                        
    for(int i=0;i<jsonArray.length();i++){ 
                            JSONObject jsonObject2 
    = (JSONObject)jsonArray.opt(i); 
                            CalendarInfo calendarInfo 
    = new CalendarInfo(); 
                            calendarInfo.setCalendar_id(jsonObject2.getString(
    "calendar_id")); 
                            calendarInfo.setTitle(jsonObject2.getString(
    "title")); 
                            calendarInfo.setCategory_name(jsonObject2.getString(
    "category_name")); 
                            calendarInfo.setShowtime(jsonObject2.getString(
    "showtime")); 
                            calendarInfo.setEndtime(jsonObject2.getString(
    "endshowtime")); 
                            calendarInfo.setAllDay(jsonObject2.getBoolean(
    "allDay")); 
                            calendarInfos.add(calendarInfo); 
                        }

    总结,普通形式的只需用JSONObject ,带数组形式的需要使用JSONArray 将其变成一个list。

    转:http://blog.163.com/tuchengju@126/blog/static/38071165201162254625961/

    关注公众号,分享干货,讨论技术



  • 相关阅读:
    CSS(八) 常见的居中定位
    VUE常用的标签属性和指令
    ES6面向对象
    ES6解构赋值
    jvarScript的多个参数
    ES6的箭头函数
    Light OJ 1125 Divisible Group Sums
    Light OJ 1168 Wishing Snake
    Light OJ 1044 Palindrome Partitioning
    hdu 3967 Zero's Number
  • 原文地址:https://www.cnblogs.com/molashaonian/p/9097686.html
Copyright © 2011-2022 走看看