gson容易混淆的几处

都是在做项目的时候遇到的坑,最后的解决办法:

直观简单就看这个,不用看最下面的demo了.

使用gson,后台如果返回类似:data:[{},{}]   或者 {  "key":{},"key2":{} ... }  前者代表是一个List<map> 也就是List<>里面放了多个对象 后面那个是Map里面放了多个对象. 

伪代码: A为一个类

 private List<A> parseResultInfo(String jsonString) {
        Gson gson = new Gson();
        Type type = new TypeToken<ArrayList<A>>() {
        }.getType();
        return gson.<ArrayList<A>>fromJson(jsonString, type);
    }


后台返回类似:data:{}   代表是一个对象

伪代码:A为一个类

 public A  parseHospitalDepartment(String datas){
        Gson gson = new Gson();
        return gson.fromJson(datas,A.class);
    }


弄错就会提示:Could not find method com.google.gson.reflect.TypeToken.<init>



还有个容易出错的点:我在一个类A里面定义了一个内部类B,正常情况下是:由于gson使用映射的方法找到B.class中对应的成员变量名称,将json格式的的字段对应的值赋值给B类中对应的成员变量。
但是由于经过proguard混淆后 B类的内部的成员变量名称发生了变化。已经无法找到json字段中对应的类成员变量。所以导致所有生成的B类成员变量值都为null 。


所以解决办法有两个:

   1是:声明内部类不混淆

             在proguard-rules.pro中加入下面规则。 对B.Java的所有private 对象不进行obfuscation。

如果是内部类可以使用下面声明::

        -keep class com.project.mocha_patient.login.FindForgotInfoActivity$ForgetResponse {*;}  
        -keep class com.project.mocha_patient.account_setting.ChangePasswordActivity$ChangePasswordResponse {*;}  

如果不是内部类:
-keep public class com.google.gson.**  
-keep public class com.google.gson.** {public private protected *;}   
-keep public class com.project.mocha_patient.login.A{ private *; }  

  

  2是:在内部类B中,将所有被gson使用的变量都加下面声明,这样gson就可以识别对应的变量。

    

@SerializedName("name")

   //下面是内部类

     static class B{
       @SerializedName("bsOrderNo")
       String bsOrderNo;//订单号
       @SerializedName("bsState")
       String bsState;//充值结果
       @SerializedName("bsLastTime")
       String bsLastTime; //日期
       @SerializedName("bsAmount")
       String bsAmount; //金额
   }


写一个demo:  这个demo是参考http://blog.csdn.net/yixiu868/article/details/54193779   只是本人作为笔记而已,如果有什么问题,可联系本人删除即可,感谢作者的无私分享

实体类:

import java.util.List;

public class Person2 {
	private String username;
	private String password;
	private double money;
	private Book book;

	public Person2() {
		super();
	}

	public Person2(String username, String password, double money, Book book) {
		super();
		this.username = username;
		this.password = password;
		this.money = money;
		this.book = book;
	}

	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 double getMoney() {
		return money;
	}

	public void setMoney(double money) {
		this.money = money;
	}

	public Book getBook() {
		return book;
	}

	public void setBook(Book book) {
		this.book = book;
	}

	@Override
	public String toString() {
		return "Person2 [username=" + username + ", password=" + password + ", money=" + money + ", book=" + book + "]";
	}
	    
}

实体类:

public class Book {
	private int id;
	private String name;
	private double price;
	private String author;

	public Book() {
		super();
	}

	public Book(String name, String author) {
		super();
		this.name = name;
		this.author = author;
	}

	public Book(int id, String name, double price, String author) {
		super();
		this.id = id;
		this.name = name;
		this.price = price;
		this.author = author;
	}

	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 getAuthor() {
		return author;
	}

	public void setAuthor(String author) {
		this.author = author;
	}

	@Override
	public String toString() {
		return "Book [id=" + id + ", name=" + name + ", price=" + price + ", author=" + author + "]";
	}
	    
	    
	    
}

工具类1:

import java.util.List;
import java.util.Map;

import com.google.gson.Gson;
import com.yiban.medical.app.controller.demo.daomain.Person2;

public class ObjectToJsonUtils {
	 /**
     * javabean to json
     * 
     * @param person
     * @return
     */
    public static String javabeanToJson(Person2 person) {
        Gson gson = new Gson();
        String json = gson.toJson(person);
        return json;
    }

    /**
     * list to json
     * 
     * @param list
     * @return
     */
    public static String listToJson(List<Person2> list) {

        Gson gson = new Gson();
        String json = gson.toJson(list);
        return json;
    }

    /**
     * map to json
     * 
     * @param map
     * @return
     */
    public static String mapToJson(Map<String, Person2> map) {

        Gson gson = new Gson();
        String json = gson.toJson(map);
        return json;
    }
}

工具类2:

import java.util.List;
import java.util.Map;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.yiban.medical.app.controller.demo.daomain.Person2;

public class JsonToObjectUtils {
	 /**
     * json to javabean
     * 
     * @param json
     */
    public static void jsonToJavaBean(String json) {
        Gson gson = new Gson();
        Person2 person = gson.fromJson(json, Person2.class);//对于javabean直接给出class实例
        System.out.println(person.toString());
    }

    /**
     * json字符串转List集合
     */

    public static void jsonToList(String json) {

        Gson gson = new Gson();
        List<Person2> persons = gson.fromJson(json, new TypeToken<List<Person2>>() {
        }.getType());//对于不是类的情况,用这个参数给出
        for (Person2 person : persons) {
            System.out.println(person);
        }
    }

    public static void jsonToMap(String json) {
        // TODO Auto-generated method stub
        Gson gson = new Gson();
        Map<String, Person2> maps = gson.fromJson(json, new TypeToken<Map<String, Person2>>() {
        }.getType());
        for (Map.Entry<String, Person2> entry : maps.entrySet()) {
            System.out.println("key: " + entry.getKey() + "  " + "value: " + entry.getValue());

        }
    }
}

最后调用:

public class testGson {
	public static void main(String[] args) {
		 // javabean to json  
        Person2 person = new Person2("彭晓", "dslkfjdslf", 344, new Book("java", "vincent"));  
        System.out.println(ObjectToJsonUtils.javabeanToJson(person));  
          
        // list to json  
        List<Person2> list = new ArrayList<Person2>();  
        list.add(person);  
        Person2 p = new Person2("彭真", "slfjdj", 32423, new Book("android", "郭林"));  
        list.add(p);  
        System.out.println(ObjectToJsonUtils.listToJson(list));  
          
        // map json  
        Map<String, Person2> map = new HashMap<String, Person2>();  
        map.put("m1", person);  
        map.put("m2", p);  
        System.out.println(ObjectToJsonUtils.mapToJson(map));  
          
        // 下面是json直接通过gson转换为实例对象  
        String json = "{'username':'张三', 'password':'123', 'money':500, 'book':{'id':0, 'name':'三国演义', 'price':'0',"  
                + "'author':'罗贯中'}}";  
        JsonToObjectUtils.jsonToJavaBean(json);  
          
        String str = "[{'username':'张三','password':'123','money':500,'book':{'id':0, 'name':'三国演义', 'price':0,'author':'罗贯中'}},"  
                + " {'username':'李四','password':'123','money':500,'book':{'id':0, 'name':'三国演义', 'price':0, 'author':'罗贯中'}}]";  
        JsonToObjectUtils.jsonToList(str);  
          
        String mapStr = "{'m1':{'username':'张三','password':'123','money':500,'book':{'id':0, 'name':'三国演义', 'price':0,'author':'罗贯中'}},"  
                + "'m2':{'username':'李四','password':'123','money':500,'book':{'id':0, 'name':'三国演义', 'price':0, 'author':'罗贯中'}}}";  
        JsonToObjectUtils.jsonToMap(mapStr);  
    } 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值