都是在做项目的时候遇到的坑,最后的解决办法:
直观简单就看这个,不用看最下面的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);
}