GSON(1)

本文深入讲解了Google的GSON库,介绍了如何使用GSON在Java对象和JSON数据间进行转换,包括字段映射、序列化排除及工具类封装。演示了简单及复杂对象的反序列化过程,并解决了字段名不匹配问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GSON是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库。可以将一个Json字符转成一个Java对象,或者将一个Java转化为Json字符串。

GitHub链接 https://github.com/google/gson/

JSON有2种类型:
一种是对象object -> {key:value,key:value,...}
另一种是数组array -> [value,value,...]

一.对 json 数据进行反序列化,得到java 对象

  1. 简单的反序列化
		String userJson = "{'sex':false,'name':'steve','number':'909','id':1}";
        Gson gson=new Gson();
        User user=gson.fromJson(userJson,User.class);

        Log.d(TAG, "name-"+user.getName()+"_________number"+user.getNumber());
        //name-steve_________number909
  1. 嵌套 Java Object 的反序列化
    例如如下json字段
{
    "age": 26,
    "email": "578570174@qq.com",
    "isDeveloper": true, 
    "name": "chenrenxiang",

    "userAddress": {
        "city": "Magdeburg",
        "country": "Germany",
        "houseNumber": "42A",
        "street": "Main Street"
    }
}

value 是数组时(hobbies),对应在java类中也是数组;value 是对象时,对应在java类中就是map(k-v对)

  1. array的反序列化
		String namesJson = "['xiaoqiang','chenrenxiang','hahaha']";
        String []array=gson.fromJson(namesJson,String [].class);
  1. List的反序列化
    对于List,反序列化时必须提供它的Type,通过Gson提供的TypeToken<T>.getType()方法可以定义当前ListType
String userJson = "[{'isDeveloper':false,'name':'xiaoqiang','age':26,'email':'578570174@qq.com'},{'isDeveloper':true,'name':'xiaoqiang123','age':27,'email':'578570174@gmail.com'}]";

Gson gson = new Gson();
Type userListType = new TypeToken<ArrayList<User>>(){}.getType();

List<User> userList = gson.fromJson(userJson, userListType); 

二.字段名不一致的问题

	public class User {
    private boolean isDeveloper;
    @SerializedName("fullName")
    private String name;
    private int age;
    private String email;
    ...
}

当json传入字段是fullname时,反序列化后fullName的值会映射给name

三.限定某个字段不参加序列化或反序列化

@Expose(serialize=false,deserialize=false)
private String name;

上面的name字段不参与序列化和反序列化

四.封装Gosn工具类

package com.example.mygson;
//gson工具类

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;

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

public class GsonUtil {

        /**
         * 私有化构造方法
         */
        private GsonUtil() {
        }

        /**
         * 静态内部类做单例
         */
        private static class SingletonHolder {
            private static final Gson gson = new Gson();
        }

        /**
         * 获取单例方法
         * @return
         */
        public static final Gson getInstance() {
            return SingletonHolder.gson;
        }



        /**
         * 将object对象转成json字符串
         *
         * @param object
         * @return
         */
        public static String GsonString(Object object) {
            String gsonString = null;
            if (getInstance() != null) {
                gsonString = getInstance().toJson(object);
            }
            return gsonString;
        }

        /**
         * 将GsonString转成泛型bean
         *
         * @param gsonString
         * @param cls
         * @return
         */
        public static <T> T GsonToBean(String gsonString, Class<T> cls) {
            T t = null;
            if (getInstance() != null) {
                t = getInstance().fromJson(gsonString, cls);
            }
            return t;
        }


        /**
         * 转成list
         * 解决泛型问题
         * @param json
         * @param cls
         * @param <T>
         * @return
         */
        public static <T> List<T> GsonToList(String json, Class<T> cls) {

            List<T> list = new ArrayList<T>();
            if (getInstance()!=null){
                JsonArray array = new JsonParser().parse(json).getAsJsonArray();
                for(final JsonElement elem : array){
                    list.add(getInstance().fromJson(elem, cls));
                }
            }

            return list;
        }


        /**
         * 转成list中有map的
         *
         * @param gsonString
         * @return
         */
        public static <T> List<Map<String, T>> GsonToListMaps(String gsonString) {
            List<Map<String, T>> list = null;
            if (getInstance() != null) {
                list = getInstance().fromJson(gsonString,
                        new TypeToken<List<Map<String, T>>>() {
                        }.getType());
            }
            return list;
        }

        /**
         * 转成map的
         *
         * @param gsonString
         * @return
         */
        public static <T> Map<String, T> GsonToMaps(String gsonString) {
            Map<String, T> map = null;
            if (getInstance() != null) {
                map = getInstance().fromJson(gsonString, new TypeToken<Map<String, T>>() {
                }.getType());
            }
            return map;
        }


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值