zoukankan      html  css  js  c++  java
  • Gson简单使用

    最近做个IM类型的Android 应用,由于有三种客户端(pc,ios,Android),所以底层使用的是C++与服务器通信,所以通信部分基本上有c++完成,封装好Jni即可,可以把底层c++通信看成一个httpclient,Android上面只需要关注UI显示即可。

    好的,交代好项目背景,下面介绍为什么使用gson。

    由于底层使用c++socket通信,通信的协议还是,最原始的那种,比如先顶一个4个字节消息长度,然后根据长度,读取这么长度的数据,然后取出通信的,消息号码,然后读出里面的数据。

    o,my god,做久了java,感觉使用了这个,好像回到的原始社会了。

    所以我们定义java与c++之间通信使用jni,传输的协议全部都是字符串,字符串里面使用json。

    做久了J2ee,所以很讲究封装。大概才传输协议时这样。

    cmd是通信的消息编码,param:表示一个随机的标示,由于通信是异步的,所以req对于的resp,需要额外的添加一个标示符,来找到对于的resp。data里面就是一个通信的的内容,resp里面添加一个字段,retcode,表示服务器的响应,0为成功,1表示网络问题,这个根据实际需要来定义

    req:{"cmd":100,"param":"0cee5015-aae6-4f67-b03e-7e95168b6563","data":{xxxxxxx}}

    resp{"cmd":100,"retCode":0,"param":"f56f8e16-ba82-429f-b724-8e4da6d4ac03","data":{xxxxx}}


    这样的简单通信协议相信很多人都是懂的,关键是data里面的数据时不一样的,项目需要根据cmd的不同,来进行分发,然后解析。

    如果使用Android自带的json解析类,那么要化很多时间进行解析,所以在这里使用gson,gson是google的开源json解析工具。官网是http://code.google.com/p/google-gson/

    gson使用还是比较简单的,比如:

    public class User {
    
    	public Name name;
    	public String passwd;
    	public int age;
    	public char sex;
    	public String[] telphone;
    
    	public String toString() {
    		return "User [name=" + name + ", passwd=" + passwd + ", age=" + age + ", sex=" + sex + ", telphone=" + Arrays.toString(telphone) + "]";
    	}
    }
    public class Name {
    
    	public String firstName;
    	public String lastName;
    	
    	public String toString() {
    		return "Name [firstName=" + firstName + ", lastName=" + lastName + "]";
    	}
    }
    public class Main {
    
    	public static void main(String[] args) {
    		Gson gson = new Gson();
    
    		Name n = new Name();
    		n.firstName = "liushui";
    		n.lastName = "bufu";
    		User u = new User();
    		u.age = 25;
    		u.name = n;
    		u.passwd = "123456";
    		u.sex = 'M';
    
    		String[] phone = new String[10];
    		for (int i = 0; i < phone.length; i++) {
    			phone[i] = "1381234567" + i;
    		}
    		u.telphone = phone;
    
    		System.out.println(u);
    		String json = gson.toJson(u);
    
    		System.out.println(json);
    
    		User u2 = gson.fromJson(json, User.class);
    		System.out.println(u2);
    	}
    }

    代码运行的结果是:

    User [name=Name [firstName=liushui, lastName=bufu], passwd=123456, age=25, sex=M, telphone=[13812345670, 13812345671, 13812345672, 13812345673, 13812345674, 13812345675, 13812345676, 13812345677, 13812345678, 13812345679]]
    {"name":{"firstName":"liushui","lastName":"bufu"},"passwd":"123456","age":25,"sex":"M","telphone":["13812345670","13812345671","13812345672","13812345673","13812345674","13812345675","13812345676","13812345677","13812345678","13812345679"]}
    User [name=Name [firstName=liushui, lastName=bufu], passwd=123456, age=25, sex=M, telphone=[13812345670, 13812345671, 13812345672, 13812345673, 13812345674, 13812345675, 13812345676, 13812345677, 13812345678, 13812345679]]



    gson很好完成json的解析与生成,很好的完成了数据的序列化与反序列化。

    gson默认使用的是字段的的名字,在这里我没有使用setter和getter方法,直接把字段进行的public处理,实际情况需要根据项目需要来使用,有的时候项目需要使用代码混淆的时候需要注意下,一种解决方法是不把字段进行混淆,或者是使用gson提供的标注来解决。

    对上面的代码进行修改,可以得到如下结果。

    public class User {
    
    	@SerializedName("_name")
    	public Name name;
    	@SerializedName("_passwd")
    	public String passwd;
    	@SerializedName("_age")
    	public int age;
    	@SerializedName("_sex")
    	public char sex;
    	@SerializedName("_telphone")
    	public String[] telphone;
    
    	public String toString() {
    		return "User [name=" + name + ", passwd=" + passwd + ", age=" + age + ", sex=" + sex + ", telphone=" + Arrays.toString(telphone) + "]";
    	}
    }

    User [name=Name [firstName=liushui, lastName=bufu], passwd=123456, age=25, sex=M, telphone=[13812345670, 13812345671, 13812345672, 13812345673, 13812345674, 13812345675, 13812345676, 13812345677, 13812345678, 13812345679]]
    {"_name":{"firstName":"liushui","lastName":"bufu"},"_passwd":"123456","_age":25,"_sex":"M","_telphone":["13812345670","13812345671","13812345672","13812345673","13812345674","13812345675","13812345676","13812345677","13812345678","13812345679"]}
    User [name=Name [firstName=liushui, lastName=bufu], passwd=123456, age=25, sex=M, telphone=[13812345670, 13812345671, 13812345672, 13812345673, 13812345674, 13812345675, 13812345676, 13812345677, 13812345678, 13812345679]]


    生成的json字符串是带有下划线的,也就是@SerializedName里面定义的别名。

    另外上面所说的通信协议中的data的结构体是不确定的,有的时候是一个字符串,或者是一个实体类或者是数组,为了满足面向对象的规则,可以使用json里面的JsonObject来表示,这样可以根据json里面的内容,自动匹配,再结合java中的泛型,既可以完美解决通信模块,程序员可以竟可能的把经历放在ui和逻辑上,通信和json的解析,可以关心的很少。

  • 相关阅读:
    CodeForces
    EOJ 3506. 斐波那契数列
    牛客练习赛13 D幸运数字Ⅳ . 康托逆展开
    UVA
    Piggy-Bank HDU
    Dollar Dayz POJ
    UVA 674 Coin Change (完全背包)
    python OOP (1)
    python lambda简易使用
    python whl模块安装方法
  • 原文地址:https://www.cnblogs.com/liushuibufu/p/4140915.html
Copyright © 2011-2022 走看看