JSON 的解析

来源:互联网 发布:达芬奇 调色软件 编辑:程序博客网 时间:2024/04/29 00:40

       JSON 的全称是 JavaScript Object Notation,即 JavaScript 对象符号,是一种轻量级的数据交换格式。JSON 提供了多种语言之间完成数据交换的能力,是一种理想的数据交换格式。

       JSON 主要有如下两种数据结构:

(1)、有 key-value 对组成的数据结构。

(2)、有序集合。

        下面介绍 JSON 的解析方式:

------> 一般的解析;

------> 使用谷歌的 Gson 解析

------> 使用阿里巴巴的 fastJSON 解析(同 Gson 差不多,不介绍)

------> 从网络上解析


在 assets 目录下,新建一个 test.json;

{  "person": {    "name": "张三",    "age": 25,    "children": [      {        "name": "李四",        "age":3      },      {        "name": "王五",        "age": 3      },      {        "name": "小黑",        "age": 1      }    ]  }}



(1)、一般的解析:

先从 assets 目录下读取文件:

    /**     *  读取 Assets 文件夹下的 test.json     */    private String readFromAssets() {        InputStream is = null;        BufferedReader br = null;        try {            is = getAssets().open("test.json");            br = new BufferedReader(new InputStreamReader(is));            StringBuilder sb = new StringBuilder("");            String str = null;            while ((str = br.readLine()) != null) {                sb.append(str);            }            return sb.toString();        } catch (IOException e) {            e.printStackTrace();        } finally {            if (br != null && is != null){                try {                    br.close();                    is.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }        return null;    }

解析从 test.json 中读取的字符串:

    /**     *  普通解析     */    private void jieXiJson(String str){        try {            JSONObject jsonObject = new JSONObject(str);            JSONObject person = jsonObject.getJSONObject("person");            String name = person.getString("name");            Integer age = person.getInt("age");            int chiSum = person.getJSONArray("children").length();            Log.d("JSON解析", "姓名:" + name + ", 年龄:" + age + ", 有多少个孩子:" + chiSum + "个");            JSONArray children = person.getJSONArray("children");            for (int i = 0; i < chiSum; i++) {                String jChiName = children.getJSONObject(i).getString("name");                int jChiAge = children.getJSONObject(i).getInt("age");                Log.d("=========","name: " + jChiName + ", 年龄: " + jChiAge);            }        } catch (JSONException e) {            e.printStackTrace();        }    }

结果如下:





(2)、使用 Gson 解析:

先下载 Gson ,如下:

使用 Gson 解析需要把 JSON 转换为对象(每个 key 都要有相应的对象),要新建几个类:

------> 从 JSON 结构可以看出有 3 个孩子(李四,王五,小黑),3 个孩子都有名字和年龄。所以创建 ChildrenT 类:

ChildrenT.java :

package com.crazy.forjson;/** * Created by antimage on 2016/1/3. */public class ChildrenT {    private String name;    private int age;    public ChildrenT(String name, int age) {        this.name = name;        this.age = age;    }    public String getName() {        return name;    }    public int getAge() {        return age;    }    public void setName(String name) {        this.name = name;    }    public void setAge(int age) {        this.age = age;    }}

------> 3 个孩子都是 children ( key ) 的值 ( value ),和 person 的 name,age 都属于 person,所以新建一个类:Person:
package com.crazy.forjson;import java.util.List;/** * Created by antimage on 2016/1/3. */public class Person {    private List<ChildrenT> children;    private String name;    private int age;    public List<ChildrenT> getChildren() {        return children;    }    public String getName() {        return name;    }    public int getAge() {        return age;    }    public void setChildren(List<ChildrenT> children) {        this.children = children;    }    public void setName(String name) {        this.name = name;    }    public void setAge(int age) {        this.age = age;    }}

现在只有 person ( key ) 没有解析了,所以新建一个有对象 person 的类,PersonT:

package com.crazy.forjson;/** * Created by antimage on 2016/1/3. */public class PersonT {    private Person person;    public Person getPerson() {        return person;    }    public void setPerson(Person person) {        this.person = person;    }}

所需的类创建好后就可以使用 Gson 解析了(使用 fastJSON 都需要创建这几个类):

    /**     *  用谷歌的 Gson 解析     */    private void forGson(String str){        Gson gson = new Gson();        PersonT personT = gson.fromJson(str, PersonT.class);        // ======================= person ======================        Person person = personT.getPerson();        String name = person.getName();        int age = person.getAge();        int chiSum = person.getChildren().size();        Log.d("person", "姓名:" + name + ", 年龄:" + age + ", 有多少个孩子:" + chiSum + "个");        // ======================= children ====================        List<ChildrenT> chiList = person.getChildren();        for (ChildrenT children : chiList) {            String chiName = children.getName();            int chiAge = children.getAge();            Log.d("children", "姓名:" + chiName + ", 年龄:" + chiAge );        }    }


(3)、从网络中解析 JSON:

从网络读取信息,首先加上相应的权限:

<uses-permission android:name="android.permission.INTERNET" />

网上的资源如下:


根据图片的信息,新建几个类(和前文的创建方法一样):

先创建类 UserT :

package com.crazy.forjson.fromnet;/** * Created by scxh on 2016/1/4. */public class UserT {    private String id;    private String userName;    private String password;    private String email;    public String getId() {        return id;    }    public void setId(String id) {        this.id = id;    }    public String getUserName() {        return userName;    }    public void setUserName(String userName) {        this.userName = userName;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }    public String getEmail() {        return email;    }    public void setEmail(String email) {        this.email = email;    }}



在创建包含 user 的类 UserFromNet:
package com.crazy.forjson.fromnet;/** * Created by scxh on 2016/1/4. */public class UserFromNet {    private UserT user;    private String message;    public UserT getUser() {        return user;    }    public void setUser(UserT user) {        this.user = user;    }    public String getMessage() {        return message;    }    public void setMessage(String message) {        this.message = message;    }}



使用异步下载:

    /**     *  从网络读取信息     */    private class DownloadTask extends AsyncTask<String, Void, String> {        @Override        protected String doInBackground(String... params) {            String str = params[0];            HttpURLConnection conn = null;            BufferedReader br = null;            try {                URL url = new URL(str);                conn = (HttpURLConnection)url.openConnection();                conn.setRequestMethod("GET");                conn.setDoInput(true);                conn.setConnectTimeout(5000);                conn.connect();                if(conn.getResponseCode() == 200){                    InputStream is = conn.getInputStream();                    br = new BufferedReader(new InputStreamReader(is));                    StringBuilder sb = new StringBuilder("");                    String str1 = null;                    while ((str1 = br.readLine()) != null) {                        sb.append(str1);                    }                    return sb.toString();                }            } catch (MalformedURLException e) {                e.printStackTrace();            } catch (IOException e) {                e.printStackTrace();            } finally {                if (br != null && conn != null) {                    try {                        br.close();                        conn.disconnect();                    } catch (IOException e) {                        e.printStackTrace();                    }                }            }            return null;        }        @Override        protected void onPostExecute(String forNet) {            jieXiFromNet(forNet);        }    }



其中的方法 jieXiFromNet(String forNet):

    /**     *  解析从网络读取的字符串 json     */    private void jieXiFromNet(String forNet) {        Gson gson = new Gson();        UserFromNet ufn = gson.fromJson(forNet, UserFromNet.class);        String message = ufn.getMessage();        Log.d("User 的 信息", "信息: " + message);        //=======================        UserT ut = ufn.getUser();        String id = ut.getId();        String userName = ut.getUserName();        String password = ut.getPassword();        String email =ut.getEmail();        Log.d("User 的详细信息", "证件号:" + id + ", 姓名:" + userName                + ", 密码:" + password + ", 邮箱" + email);    }

结果如下:



0 0
原创粉丝点击