tangs

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  
}

 

分类:

技术点:

相关文章: