Gson为google封装的,不需要get set方法
import java.util.List; import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; //Gson解析可以没有get set方法 注意类的成员变量必须与json数据的键一致 class Emp {//员工 private String name; private int salary; @Override public String toString() { return "Emp [name=" + name + ", salary=" + salary + "]"; } } class Dept {//部门 private int no; private String name; private List<Emp> list; @Override public String toString() { return "Dept [list=" + list + ", name=" + name + ", no=" + no + "]"; } } public class TestGSON { public static void main(String[] args) { //最外层是一对{} 对象的解析方法 String json = "{no:1,name:\'研发部\',list:[{no:1001,name:\'王思远\',salary:20000}]}"; Gson gson = new Gson(); Dept dept = gson.fromJson(json, Dept.class); System.out.println(dept); //对于最外层为数组的解析方法 String json2 = "[{no:1001,name:\'研发部\',list:[{name:\'李晨\',salary:30000},{name:\'王思远\',salary:3}]},{no:2,name:\'市场部\',list:[{name:\'周周\',salary:19000}]}]"; TypeToken<List<Dept>> typeToken = new TypeToken<List<Dept>>() {}; List<Dept> list = gson.fromJson(json2, typeToken.getType()); System.out.println(list); } }
对于最外层是大括号的:
/** * 将json数据用Gson解析出来 * @param jsonData json数据 * @param clazz json实体类的字节码 * @return 根据传进来的字节码确定返回对象 */ public static <T>T gsonToBean(String jsonData,Class<T> clazz){ Gson gson = new Gson(); T t = gson.fromJson(jsonData, clazz); return t; }
使用Gson 直接对json数据的处理
@Test public void test(){ //打印 json数据的 键与值 /** { success: "1", data: { a_1_1: "111222", a_1_2: "2017-11-22", a_1_3: "2", a_2_0: "李四", a_2_1: "2", a_2_10: "2" } } *///数据如上 String str = "{success: \"1\",data: {a_1_1: \"111222\",a_1_2: \"2017-11-22\",a_1_3: \"2\",a_2_0: \"李四\",a_2_1: \"2\",a_2_10: \"2\"}}"; JsonElement je = new JsonParser().parse(str); if(je.isJsonObject()){ final JsonElement data = je.getAsJsonObject().get("data"); if(data.isJsonObject()){ final JsonElement a_1_1 = data.getAsJsonObject().get("a_1_1"); System.out.println("通过键拿到值:" + a_1_1.getAsString().toString()); } } //打印所有的键值对 JsonObject jsonObject = new JsonParser().parse(str).getAsJsonObject(); println(jsonObject); System.out.println("我要开始需改了"); //修改 JsonObject data = jsonObject.get("data").getAsJsonObject(); data.addProperty("a_1_1","修改好的"); println(jsonObject); System.out.println("最后的json=" + jsonObject.toString()); } /** * 打印json数据的所有信息 * @param jsonObject */ public void println(JsonObject jsonObject){ JsonObject data = jsonObject.get("data").getAsJsonObject();//拿到data 层的数据 然后遍历打印 Set<Map.Entry<String, JsonElement>> entrySet = data.entrySet(); for(Map.Entry<String, JsonElement> type : entrySet){ System.out.println("字段=" + type.getKey().toString() + ",值=" + type.getValue().toString()); } }
结果如下:
Gson工具类:
/** * gson工具类 */ public class GsonUtils { /** * json字符串变为实体类 * * @param json * json字符串 * @param cls * 实体类的class类型 */ public static <T> T getModelfromJson(String json, Class<T> cls) { Gson gson = new Gson(); T t = null; try { t = gson.fromJson(json, cls); } catch (Exception e) { e.printStackTrace(); } return t; } /*** * 获取list实体列表 * * @param json * 字符串 * @return */ public static <T> ArrayList<T> getListfromJson(String json, Class<T> cls) { Gson gson = new Gson(); ArrayList<T> list = new ArrayList<T>(); try { list = gson.fromJson(json, new TypeToken<ArrayList<T>>() { }.getType()); } catch (Exception e) { e.printStackTrace(); } return list; } /** 获取map的list列表 */ public static <T> List<Map<String, Object>> getListMapFromJson(String json) { List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); Gson gson = new Gson(); try { list = gson.fromJson(json, new TypeToken<List<Map<String, Object>>>() { }.getType()); } catch (Exception e) { e.printStackTrace(); } return list; } /** * 返回cla 类型的list数组 * * @param s * @param cla * @return */ public static <T extends Object> T jsonToBeanList(String s, Class<?> cla) { List<Object> ls = new ArrayList<Object>(); JSONArray ss; try { ss = new JSONArray(s); for (int i = 0; i < ss.length(); i++) { String str = ss.getString(i); Object a = jsonToBean(str, cla); ls.add(a); } } catch (JSONException e) { // TODO Auto-generated catch block e.printStackTrace(); } return (T) ls; } /** * 将jsonStr转换成cl对象 * * @param jsonStr * @return */ public static <T extends Object> T jsonToBean(String jsonStr, Class<?> cl) { Object obj = null; Gson gson = new Gson(); if (gson != null) { if (!TextUtils.isEmpty(jsonStr)) obj = gson.fromJson(jsonStr, cl); } return (T) obj; } }
json转Map
//实体类 Map<String, 实体类> map = new Gson().fromJson(json, new TypeToken<Map<String, 实体类>>(){ }.getType()); for(String key : map.keySet()){ LogUtil.e("key:" + key); }
json解析成Map的例子:
比如有组这样的json数据(后台给你传这样的数据,你会打他吗)
{ "code": 0, "msg": "请求成功", "data": { "全部": 0, "收款": 1001, "升级高级vip": -1001, "余额提现": 1003, "信用卡测评": -1003 } }
实体类:
效果图:
如果json数据只有map的那一部分,比如:
{ "全部": 0, "收款": 1001, "升级高级vip": -1001, "余额提现": 1003, "信用卡测评": -1003 }
测试例子:
如果是这样解析呢?直接.fromJson()
那你可能会想使用String接收了,然后就.......
如果使用Object处理了?那么不是基本类型与String的都又变成了一个Map了,此时就又出现了将int类型转成了Double了
解决这个问题,如下:
json转Map:
/** * 避免 int 转成了 double */ private val gson = GsonBuilder().registerTypeAdapter( LinkedHashMap::class.java, object : JsonDeserializer<LinkedHashMap<String, Any>> { override fun deserialize( json: JsonElement, typeOfT: Type, context: JsonDeserializationContext ): LinkedHashMap<String, Any> { val resultMap = LinkedHashMap<String, Any>() val jsonObject = json.asJsonObject val entrySet = jsonObject.entrySet() for ((key, value) in entrySet) { resultMap.put(key, value) } return resultMap } }).create() /** * LinkedHashMap 是为了 map排序跟json数据一致 */ fun json2Map(json: String): HashMap<*, *>? { val fromJson = gson.fromJson(json, LinkedHashMap::class.java) return fromJson }
日志:
可参考:
详解Gson使用(四)Map对象转化
Object转Json,过滤指定字段或者类:
fun toJsonFilter(any: Any): String? { val gson = GsonBuilder() .setExclusionStrategies(object : ExclusionStrategy { override fun shouldSkipField(f: FieldAttributes): Boolean { //排除 messageIsRead 与 _id 字段 return "messageIsRead" == f.name || "_id" == f.name } override fun shouldSkipClass(clazz: Class<*>): Boolean { //return clazz == ImgFlagBean::class.java//排除这个类 return false } }) .create() return gson.toJson(any) }
JsonObject的使用:
val jsonObject = com.google.gson.JsonObject() jsonObject.addProperty("a",1) jsonObject.addProperty("b",2) val arr = JsonArray() val obj = JsonObject(); obj.addProperty("反贼", "宋江"); obj.addProperty("反贼年龄", 45); arr.add(obj) //添加到该数组的键值对的值中 jsonObject.add("数组",arr) println("json = ${jsonObject.toString()}") println("获取某个值,a:${jsonObject.get("a").asString}") //通过key 获取 值 //使用JsonObject解析Json val fromJson = Gson().fromJson<JsonObject>(jsonObject.toString(), JsonObject::class.java) println("获取里面的arr:${fromJson.getAsJsonArray("数组")}") println("获取里面的arr中第一个的:${fromJson.getAsJsonArray("数组").get(0).asJsonObject.get("反贼年龄").asInt}")
日志:
需要注意的是:jsonObject.get("key") 如果对应的json值为null, 返回的值为JsonNull对象,所以非空判断需要使用:
if(get("key").isJsonNull.not()){ //json串中key的值不为null }