Gson解决数字默认转为double以及时间类型format问题

文章讲述了在使用Gson将JSON字符串转换为Map时遇到的问题,即数字会被自动转换为浮点型。提供了两种解决方案:自定义对象类型避免类型转换,以及使用Gson2.8.9版本设置ToNumberPolicy以控制数字类型转换。
摘要由CSDN通过智能技术生成

问题1:

日期类型格式化问题

只需要.setDateFormat("yyyy-MM-dd HH:mm:ss")即可

 Gson gson = new GsonBuilder()
                .setDateFormat("yyyy-MM-dd HH:mm:ss")
                .create();

问题2:

        String json="{\"code\":2,\"sds\":2.1}"; 
        Gson gson = new GsonBuilder()
                .create();
        System.out.println(gson.fromJson(json, Map.class));

打印{code=2.0, sds=2.1}

原因

当json字符串转为Map这种不确定的对象时,gson会默认数字类型转为浮点型

解决方法

方法1

自己创建对应类型的对象,并在创建属性时就觉得了对应字段的类型

方法2

使用2.8.9版本的gson

        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
            <version>2.8.9</version>
        </dependency>
        String json="{\"code\":2,\"sds\":2.1}";

        Gson gson = new GsonBuilder()
                .setObjectToNumberStrategy(ToNumberPolicy.LONG_OR_DOUBLE)
                .setDateFormat("yyyy-MM-dd HH:mm:ss")
                .create();
        System.out.println(gson.fromJson(json, Map.class));

打印{code=2, sds=2.1}

在 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、付费专栏及课程。

余额充值