• Amdroid示例:利用Gson生成或解析json


    转自:http://www.cnblogs.com/liqw/p/4266209.html

    目前手机端和服务端数据交流格式一般是json,而谷歌提供了Gson来解析json。下载Gson:https://code.google.com/p/google-gson/

    下载的放在lib并导入,若出现错误:java.lang.NoClassDefFoundError: com.google.gson.Gson

    是因为没有导入android-support-v4.jar,导入即可。

    一、单个对象生成json

    生成以下类,该怎么生成呢?

    1
    2
    3
    4
    5
    6
    {
        "createDate""2015-02-01 10:39:50",
        "id""1",
        "name""传说之美",
        "password""123456"
    }

    先定义一个account类,属性有id、name、password、createDate。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    public class Account {
        private String id;
        private String password;
        private String name;
        private String createDate;
        public Account() {
            super();
        }
        public Account(String id, String password, String name, String createDate) {
            super();
            this.id = id;
            this.password = password;
            this.name = name;
            this.createDate = createDate;
        }
        public String getId() {
            return id;
        }
        public void setId(String id) {
            this.id = id;
        }
        public String getPassword() {
            return password;
        }
        public void setPassword(String password) {
            this.password = password;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getCreateDate() {
            return createDate;
        }
        public void setCreateDate(String createDate) {
            this.createDate = createDate;
        }
        @Override
        public String toString() {
            return "Account [id=" + id + ", password=" + password + ", name=" + name + ", createDate=" + createDate + "] ";
        }
    }

    定义好这个类,就可以利用Gson生成json字符串了。

    1
    2
    3
    4
    5
    6
    7
    8
    // 生成account对象
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
    Account account = new Account("1""123456""传说之美", sdf.format(new Date()));
     
    // 利用gson对象生成json字符串
    Gson gson = new Gson();
    String jsonString = gson.toJson(account);
            Log.i("", jsonString);

    输入的log如下

     二、解析json字符串单个对象

     在上面已生成了jsonString,那如何将其解析为单个对象,很简单。

    1
    2
    3
    // 利用gson解析json字符串为单个对象
    Account account1 = gson.fromJson(jsonString, Account.class);
    Log.i("", account1.toString());

    看看输出的log

    三、生成单个对象的json数组

    什么事json数组,类似下面的

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    [
        {
            "id""2",
            "createDate""2015-02-01 11:21:27",
            "password""123456",
            "name""传说"
        },
        {
            "id""2",
            "createDate""2015-02-01 11:21:27",
            "password""123456",
            "name""之美"
        }
    ]

    生成json数组代码如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Account account2 = new Account("2""123456""传说", sdf.format(new Date()));
    Account account3 = new Account("2""123456""之美", sdf.format(new Date()));
    List<Account> accountList = new ArrayList<Account>();
    accountList.add(account2);
    accountList.add(account3);
     
     
    JSONArray accountArray = new JSONArray();
    for (int i = 0; i < accountList.size(); i++) {
        String accountStr = gson.toJson(accountList.get(i));
        JSONObject accountObject;
        try {
            accountObject = new JSONObject(accountStr);
            accountArray.put(i, accountObject);
        catch (JSONException e) {
            e.printStackTrace();
        }
    }
    Log.i("", accountArray.toString());

    log的输出为

    四、由多个单个对象的json数组解析为对个单个对象

    多个单个对象组成的json数组解析如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    // 解析json数组
    List<Account> accountList2 = new ArrayList<Account>();
    for(int i=0;i<accountArray.length(); i++){
        JSONObject jsonObject = null;
        try {
            jsonObject = accountArray.getJSONObject(i);
        catch (JSONException e) {
            e.printStackTrace();
        }
        if(jsonObject != null){
            Account tempAccount = gson.fromJson(jsonObject.toString(), Account.class);
            accountList2.add(tempAccount);
        }
    }
    Log.i("accountList2", accountList2.toString());

    输出的log

     

    或者用更快捷的转化方法

    1
    2
    3
    4
    5
    6
    Account[] accountArrays = new Gson().fromJson(accountArray.toString(), Account[].class);
    for(int i=0;i<accountArrays.length;i++){
        Log.i("accountArrays",accountArrays[i].toString());
    }
    // 转化为List
    List<Account> foosList = Arrays.asList(accountArrays);

    更快捷地解析成List

    1
    2
    3
    4
    // 更快捷地解析成List
    Type listType = new TypeToken<ArrayList<Account>>(){}.getType();
    ArrayList<Account> accsList = new Gson().fromJson(accountArray.toString(), listType);
    Log.i("accsList",accsList.toString());

    五、生成一个对象嵌套对象的json

    嵌套的json类似如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    {
        "member": {
            "id""4",
            "name""我是传说"
        },
        "id""4",
        "createDate""2015-02-02 12:03:32",
        "password""888888",
        "name""传说之美"
    }

    生成这个json有2种方法。

    1、再添加一个member类,像添加account类一样添加即可。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    public class Member {
        private String id;
        private String name;
        public Member() {
            super();
        }
        public Member(String id, String name) {
            super();
            this.id = id;
            this.name = name;
        }
        public String getId() {
            return id;
        }
        public void setId(String id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        @Override
        public String toString() {
            return "Member [id=" + id + ", name=" + name + "] ";
        }
    }

    生成代码如下

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // 生成对象嵌套对象的json
    Account account4 = new Account("4""888888""传说之美", sdf.format(new Date()));
    Member member = new Member("4""我是传说");
    String accountStr = gson.toJson(account4);
    String memberStr = gson.toJson(member);
    JSONObject object = null;
    try {
        JSONObject memberObject = new JSONObject(memberStr);
        object = new JSONObject(accountStr);
        object.put("member", memberObject);    
    catch (JSONException e) {
        e.printStackTrace();
    }
    Log.i("", object.toString());

    输出的log

    六、解析对象嵌套对象的json 

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Account account5 = gson.fromJson(object.toString(), Account.class);
    Log.i("解析对象嵌套对象的json", account5.toString());
    // 这里用isNull来判断是否存在这个object,存在就拿出member的JSONObject
    JSONObject memberObject = null;
    if(!object.isNull("member")){
        try {
            memberObject = object.getJSONObject("member");
        catch (JSONException e) {
            e.printStackTrace();
        }
    }
    Member member5 = null;
    if(null != memberObject){
        member5 = gson.fromJson(memberObject.toString(), Member.class);
        Log.i("解析对象嵌套对象的json", member5.toString());
    }

    输出的结果

     7、另外一种解析对象嵌套对象的json 

    定义一个类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    public class AccountObject {
        private String id;
        private String password;
        private String name;
        private String createDate;
        private MemberObject memberObject = new MemberObject();
         
        public class MemberObject {
            private String id;
            private String name;
            @Override
            public String toString() {
                return "MemberObject [id=" + id + ", name=" + name+ "] ";
            }
        }
        @Override
        public String toString() {
            return "AccountObject [id=" + id + ", password=" + password + ", name=" + name + ", createDate=" + createDate + ","+ memberObject.toString() + "] ";
        }
    }

    生成json并解析

    1
    2
    3
    4
    5
    6
    7
    8
    9
    try {
        JSONObject mObject = new JSONObject(memberStr);
        object = new JSONObject(accountStr);
        object.put("memberObject", mObject);       
    catch (JSONException e) {
        e.printStackTrace();
    }
    AccountObject accountObject = gson.fromJson(object.toString(), AccountObject.class);
    Log.i("accountObject", accountObject.toString());

    打印出来的log

    本文博客原创地址:http://www.cnblogs.com/liqw/p/4266209.html

    demo下载链接:http://files.cnblogs.com/files/liqw/LauncherActivity.zip

  • 相关阅读:
    作业:ATM
    软件开发目录规范
    re模块
    logging模块
    ConfigParser模块&hashlib模块&subprocess模块
    json模块&pickle模块&shelve模块&xml模块
    时间模块time&datetime
    vue里面render详细写法
    node.js创建服务
    vue退出功能的实现
  • 原文地址:https://www.cnblogs.com/boonya/p/4332458.html
Copyright © 2020-2023  润新知