gson转换数值问题,int double long date

开发中总会用到字符串转换对象的工具,如fastjson,gson;这两种json转换工具,项目中初步用到可能会遇到 数值类型时间类型的转换问题;

根据地层代码分析,主要由于类型适配器的问题,gson 的TypeAdapter该类的所有继承类进行类型转换的,如果想要重写某种类型的转换方式并实用到自己的项目中,直接创建与某种类型的Adapter并继承该类并放到与gson包中该类一致的目录,则类加载器优先加载项目.class再加载包中的,所以,可以通过重写该适配器就行,如果这种不适合自己项目;第二种方法则是自定义适配器并继承ObjectAdapter(gson包中的),然后重写该类的所有方法将类型转换的代码改写适配自己的项目转换要求,然后再构建gson对象时,将该自定义适配器通过反射的方法set到List<TypeAdapterFactory> 中ObjectAdapter对应的位置,下图为构建第二种方式截图:(第一种直接找到对应的gson包中的类直接拿出来放到自己项目中,注意类全路径必须与该类在gson包的全路径一致)

Gson gson = new GsonBuilder().create();
        try {
            Field factories = Gson.class.getDeclaredField("factories");
            factories.setAccessible(true);
            Object o = factories.get(gson);
            Class<?>[] declaredClasses = Collections.class.getDeclaredClasses();
            for (Class c : declaredClasses) {
                if ("java.util.Collections$UnmodifiableList".equals(c.getName())) {
                    Field listField = c.getDeclaredField("list");
                    listField.setAccessible(true);
                    List<TypeAdapterFactory> list = (List<TypeAdapterFactory>) listField.get(o);
                    int i = list.indexOf(ObjectTypeAdapter.FACTORY);
                    list.set(i, MapTypeAdapter.FACTORY);
                    break;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Kotlin 中,Gson 默认将 int 类型转换double 类型是因为 JSON 格式中没有 int 类型,只有数字类型。因此 Gson 在解析 JSON 数据时,将所有数字类型都解析为 double 类型。如果你想要将 int 类型保留为 int 类型,可以使用 GsonBuilder 在创建 Gson 对象时设置一个自定义的 TypeAdapter。 以下是一个示例,展示如何将 int 类型保留为 int 类型: ```kotlin val gson = GsonBuilder() .registerTypeAdapter(Int::class.java, object : TypeAdapter<Int>() { @Throws(IOException::class) override fun write(out: JsonWriter, value: Int?) { if (value == null) { out.nullValue() return } out.value(value) } @Throws(IOException::class) override fun read(`in`: JsonReader): Int { if (`in`.peek() == JsonToken.NULL) { `in`.nextNull() return 0 } return try { `in`.nextInt() } catch (e: NumberFormatException) { 0 } } }) .create() ``` 在这个示例中,我们创建了一个 GsonBuilder 对象,并注册了一个自定义的 TypeAdapter。这个 TypeAdapter 用于将 int 类型保留为 int 类型。在 write() 方法中,我们将 int 值写入 JsonWriter。在 read() 方法中,我们从 JsonReader 中读取 int 值。如果值为 null,则写入 null 值。如果读取的值不是 int 类型,则返回默认值 0。 此后,你可以使用这个 Gson 对象将 JSON 数据转换为对象,其中 int 类型将保留为 int 类型。例如: ```kotlin val jsonString = "{\"value\": 42}" val data = gson.fromJson(jsonString, Data::class.java) println(data.value) ``` 这里我们假设你有一个名为 Data 的数据类,它有一个 int 类型的属性 value。在这个示例中,我们将一个包含 int 类型值的 JSON 字符串反序列化为 Data 对象,并输出 value 属性的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值