Android基础之Json解析(上)

来源:互联网 发布:淘宝面膜排行榜 编辑:程序博客网 时间:2024/05/16 07:20

   前阵子学习了android中重要的知识点:Json解析,它作为跨平台的数据格式,经常被我们用来实现客户端与服务器之间的数据交换。真正接触到json是在我写毕设中的推送功能时遇到的,推送的数据格式是json格式的,需要对其进行解析,而且该json中数据还涉及到嵌套,所以,下功夫学好json解析是很有必要的,特发一文来记录一下。闲话少说,下面来进入正题,看看json解析如何实现吧:

  • 什么是Json?它有什么特点和好处?
Json(Javascript Object Notation)是一种轻量级的数据交换格式,相比于xml这种数据交换格式来说,因为解析xml比较的复杂,而且需要编写大段的代码,所以客户端和服务器的数据交换格式往往通过json来进行交换。

特点:1).本质是具有特定格式的字符串;

         2).它完全独立于编程语言,可以跨平台使用;

         3).Json比xml数据传输有效性、效率要高很多。

  • Json的数据格式有哪些?
Json数据格式有两种:Json对象和Json数组

1.Json对象格式:

结构:{key:value,key:value,...};//key的数据类型为String,value的数据类型为数值、String、空、json对象或者数组

这种以键值对存放的形式类似于数据结构中的map

例子:{“name”:“小美”,“age”:16};

2.Json数组格式:

结构:[value,value,value...];//value的数据类型为数值、空、String、json对象或者数组,同上

类似于数据结构中的list

例子:[12,“小名”,[],{“name”:“小美”}];

json格式的数据总体看起来还是蛮通俗易懂的。

  • Json解析的具体使用方向?
1.用于将Java对象转化为Json格式的字符串数据,一般应用于服务端

2.用于将Json格式的字符串转化为Java的对象,一般应用于客户端

  • Json主要解析方式:
常用的有:

1.json原生的解析技术,虽然复杂,但是最为灵活;

2.使用三方框架Gson来解析,使用方便,几行代码搞定,官方推荐系列;

3.FastJson解析,同样使用三方框架,与Gson类似

注意:第一种方式只能将json转化为java对象,而第二种和第三者可以实现两者的互转。

  • 使用android原生的json解析技术
1.将Json格式字符串转化为Java对象:

这里直接上代码了,里面有注释

// (1)将json格式的字符串{}转换为Java对象
    private void jsonToJavaObject() {


        // 1 获取或创建JSON数据
        String json = "{\n" +
                "\t\"id\":2, \"name\":\"大虾\", \n" +
                "\t\"price\":12.3, \n" +
                "\t\"imagePath\":\"http://192.168.10.165:8080/L05_Server/images/f1.jpg\"\n" +
                "}\n";


        ShopInfo shopInfo = null;


        // 2 解析json
        try {
            JSONObject jsonObject = new JSONObject(json);
//            int id = jsonObject.getInt("id");
            int id1 = jsonObject.optInt("id");


            String name = jsonObject.optString("name");


            double price = jsonObject.optDouble("price");


            String imagePath = jsonObject.optString("imagePath");


            // 封装Java对象
            shopInfo = new ShopInfo(id1, name, price, imagePath);


        } catch (JSONException e) {
            e.printStackTrace();
        }


        // 3 显示JSON数据
        tv_native_orignal.setText(json);
        tv_native_last.setText(shopInfo.toString());
    }

注意点:1).可以通过getString()和optString()两种方式来获取JsonObject的数据,区别在于:后者中key不存在时,会返回空字符串或者指定值,而前者会报空指针异常,所以建议使用后者optxxx()方法。

2).需要创建一个数据的实体类来接收数据

// 商店的实体类
public class ShopInfo {
    private int id;
    private String name;
    private double price;
    private String imagePath;


    public ShopInfo(int id, String name, double price, String imagePath) {
        this.id = id;
        this.name = name;
        this.price = price;
        this.imagePath = imagePath;
    }


    public ShopInfo() {
    }


    public int getId() {
        return id;
    }


    public void setId(int id) {
        this.id = id;
    }


    public String getName() {
        return name;
    }


    public void setName(String name) {
        this.name = name;
    }


    public double getPrice() {
        return price;
    }


    public void setPrice(double price) {
        this.price = price;
    }


    public String getImagePath() {
        return imagePath;
    }


    public void setImagePath(String imagePath) {
        this.imagePath = imagePath;
    }


    @Override
    public String toString() {
        return "ShopInfo{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", price=" + price +
                ", imagePath='" + imagePath + '\'' +
                '}';
    }
}

2.将Json数组转化为Java对象的list

前者只用java对象承接json解析的数据即可,而这里使用对象list来实现

(2)将json格式的字符串数组转换为Java对象的List
    private void jsonToJavaList() {


        // 1 获取或创建JSON数据
        String json = "[\n" +
                "    {\n" +
                "        \"id\": 1,\n" +
                "        \"imagePath\": \"http://192.168.10.165:8080/f1.jpg\",\n" +
                "        \"name\": \"大虾1\",\n" +
                "        \"price\": 12.3\n" +
                "    },\n" +
                "    {\n" +
                "        \"id\": 2,\n" +
                "        \"imagePath\": \"http://192.168.10.165:8080/f2.jpg\",\n" +
                "        \"name\": \"大虾2\",\n" +
                "        \"price\": 12.5\n" +
                "    }\n" +
                "]";


        List<ShopInfo> shops = new ArrayList<>();


        // 2 解析json
        try {
            JSONArray jsonArray = new JSONArray(json);


            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject jsonObject = jsonArray.getJSONObject(i);


                if (jsonObject != null) {
                    int id = jsonObject.optInt("id");


                    String name = jsonObject.optString("name");


                    double price = jsonObject.optDouble("price");


                    String imagePath = jsonObject.optString("imagePath");


                    // 封装Java对象
                    ShopInfo shopInfo = new ShopInfo(id, name, price, imagePath);


                    shops.add(shopInfo);
                }
            }
        } catch (JSONException e) {
            e.printStackTrace();
        }


        // 3 显示JSON数据
        tv_native_orignal.setText(json);
        tv_native_last.setText(shops.toString());
    }

3.如果是复杂的json数据格式,可以分层解析,可以使用hiJson与as中自带封装对象的工具GsonForMat

小结:注意json常用解析方法和格式,熟悉常用json对象封装的工具GsonForMat以及解析工具,熟悉json复杂解析的步骤流程,下一篇文章会记录一下Gson解析框架的使用。

1 0
原创粉丝点击