Gson反序列化时,int变double

原文地址

主要面临的问题

  1. json字符串反序列化map对象时,int变double的解决办法
  2. json字符串格式时间字符串与Date对象的直接转换
  3. 字符串与枚举的直接转换

字符串

"{\"lngnum\":12,\"dbnum\":12.34,\"datetime\":\"2014-12-23 12:09:21\",\"date\":\"2014-12-23\",
\"next\":{\"lngnum\":12,\"dbnum\":12.34,\"datetime\":\"2014-12-23 12:09:21\",\"date\":\"2014-12-23\"}}";

常用的方法

 /**
     * 获取javaBean的属性map
     *
     * @param javaBean
     * @return
     */
    public static Map<String, Object> getPropertiesMap(Object javaBean) {
        if (javaBean instanceof Map) {
            return (Map<String, Object>) javaBean;
        }
        TypeToken<Map<String, Object>> type = new TypeToken<Map<String, Object>>() {
        };
        Gson gson = new Gson();
        return gson.fromJson(gson.toJson(javaBean), type.getType());
    }

结果

lngnum-12.0-Double//整型变为了浮点类型
dbnum-12.34-Double
datetime-2014-12-23 12:09:21-String
date-2014-12-23-String
====================
next-Map start
lngnum-12.0-Double//整型变为了浮点类型
dbnum-12.34-Double
datetime-2014-12-23 12:09:21-String
date-2014-12-23-String
next-Map end
====================

解决方法

重新实现TypeAdapter

/**
     * json字符串转list或者map
     *
     * @param json
     * @param typeToken
     * @return
     */
    public static <T> T fromJson(String json, TypeToken<T> typeToken) {
        Gson gson = new GsonBuilder()
                .registerTypeAdapter(typeToken.getType(), new MapTypeAdapter()).create();
        return gson.fromJson(json, typeToken.getType());
    }
package com.ldt.utils;

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

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.TypeAdapter;
import com.google.gson.internal.LinkedTreeMap;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;

/**
 * 
 * @author Administrator
 *
 */
public class GsonUtil {

	/**
	 * 实现格式化的时间字符串转时间对象
	 */
	private static final String DATEFORMAT_default = "yyyy-MM-dd HH:mm:ss";

	/**
	 * 使用默认的gson对象进行反序列化
	 * 
	 * @param json
	 * @param typeToken
	 * @return
	 */
	public static &lt;T&gt; T fromJsonDefault(String json, TypeToken&lt;T&gt; typeToken) {
		Gson gson = new Gson();
		return gson.fromJson(json, typeToken.getType());
	}

	/**
	 * json字符串转list或者map
	 * 
	 * @param json
	 * @param typeToken
	 * @return
	 */
	public static &lt;T&gt; T fromJson(String json, TypeToken&lt;T&gt; typeToken) {

		Gson gson = new GsonBuilder()
		/**
		 * 重写map的反序列化
		 */
		.registerTypeAdapter(new TypeToken&lt;Map&lt;String, Object&gt;&gt;() {
		}.getType(), new MapTypeAdapter()).create();

		return gson.fromJson(json, typeToken.getType());

	}

	/**
	 * json字符串转bean对象
	 * 
	 * @param json
	 * @param cls
	 * @return
	 */
	public static &lt;T&gt; T fromJson(String json, Class&lt;T&gt; cls) {

		Gson gson = new GsonBuilder().setDateFormat(DATEFORMAT_default)
				.create();

		return gson.fromJson(json, cls);

	}

	/**
	 * 对象转json
	 * 
	 * @param obj
	 * @param format
	 * @return
	 */
	public static String toJson(Object obj, boolean format) {

		GsonBuilder gsonBuilder = new GsonBuilder();
		/**
		 * 设置默认时间格式
		 */
		gsonBuilder.setDateFormat(DATEFORMAT_default);

		/**
		 * 添加格式化设置
		 */
		if (format) {
			gsonBuilder.setPrettyPrinting();
		}

		Gson gson = gsonBuilder.create();

		return gson.toJson(obj);
	}

	 public static class MapTypeAdapter extends TypeAdapter<Object> {

        @Override
        public Object read(JsonReader in) throws IOException {
            JsonToken token = in.peek();
            switch (token) {
                case BEGIN_ARRAY:
                    List<Object> list = new ArrayList<Object>();
                    in.beginArray();
                    while (in.hasNext()) {
                        list.add(read(in));
                    }
                    in.endArray();
                    return list;
                case BEGIN_OBJECT:
                    Map<String, Object> map = new LinkedTreeMap<String, Object>();
                    in.beginObject();
                    while (in.hasNext()) {
                        map.put(in.nextName(), read(in));
                    }
                    in.endObject();
                    return map;
                case STRING:
                    return in.nextString();
                case NUMBER:
                    /**
                     * 改写数字的处理逻辑,将数字值分为整型与浮点型。
                     */
                    double dbNum = in.nextDouble();
                    // 数字超过long的最大值,返回浮点类型
                    if (dbNum > Long.MAX_VALUE) {
                        return dbNum;
                    }
                    // 判断数字是否为整数值
                    long lngNum = (long) dbNum;
                    if (dbNum == lngNum) {
                        return lngNum;
                    } else {
                        return dbNum;
                    }
                case BOOLEAN:
                    return in.nextBoolean();
                case NULL:
                    in.nextNull();
                    return null;
                default:
                    throw new IllegalStateException();
            }
        }

        @Override
        public void write(JsonWriter out, Object value) throws IOException {
        }

    }
}

 

 

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值