zoukankan      html  css  js  c++  java
  • Android 利用Gson生成或解析json

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

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

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

    一、单个对象生成json

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

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

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

    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字符串了。

    		// 生成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,那如何将其解析为单个对象,很简单。

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

    看看输出的log

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

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

    [
        {
            "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数组代码如下

    		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数组解析如下

    		// 解析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

     

    或者用更快捷的转化方法

    		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

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

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

    嵌套的json类似如下

    {
        "member": {
            "id": "4", 
            "name": "我是传说"
        }, 
        "id": "4", 
        "createDate": "2015-02-02 12:03:32", 
        "password": "888888", 
        "name": "传说之美"
    }
    

    生成这个json有2种方法。

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

    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 + "]
    
    ";
    	}
    }
    

    生成代码如下

    		// 生成对象嵌套对象的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 

    		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 

    定义一个类

    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并解析

    		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

  • 相关阅读:
    Codeforces 712B. Memory and Trident
    Codeforces 712A. Memory and Crow
    kkb --- webpack实战
    前端性能优化
    前端防抖
    css面试题
    七、服务端渲染 ---kkb
    数据结构与算法(位运算)
    数据结构与算法(栈、队列、链表)
    vue-cli 配置项以及请求的封装
  • 原文地址:https://www.cnblogs.com/liqw/p/4266209.html
Copyright © 2011-2022 走看看