解决Long类型超过16位丢失精度问题的两种方法

第一种 :需要精确指定某些字段,id或者日期等。

添加类LongJsonSerializer,代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

/**

 * Long 类型字段序列化时转为字符串,避免js丢失精度

 *

 */

public class LongJsonSerializer extends JsonSerializer<Long> {

    @Override

    public void serialize(Long value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {

        String text = (value == null null : String.valueOf(value));

        if (text != null) {

            jsonGenerator.writeString(text);

        }

    }

}

  因此在包里再添加类LongJsonDeserializer,代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

/**

 * 将字符串转为Long

 *

 */

public class LongJsonDeserializer extends JsonDeserializer<Long> {

    private static final Logger logger = LoggerFactory.getLogger(LongJsonDeserializer.class);

  

    @Override

    public Long deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {

        String value = jsonParser.getText();

        try {

            return value == null null : Long.parseLong(value);

        catch (NumberFormatException e) {

            logger.error("解析长整形错误", e);

            return null;

        }

    }

}

  

接下来是使用这两个类。

在需要处理的id字段上,加上注解。

1

2

3

4

5

6

/**

 * id

 */

@JsonSerialize(using = LongJsonSerializer.class)

@JsonDeserialize(using = LongJsonDeserializer.class)

private Long id;

第二种: 全局设置,该设置会将影响所有指定类型的字段,比如Long 或者Date

@Configuration
public class LongToJsonConfig extends WebMvcConfigurationSupport {
    /**
     * springboot
     * 解决long、bigint转json丢失精度
     */
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
        ObjectMapper objectMapper = new ObjectMapper();
        
        SimpleModule simpleModule = new SimpleModule();
/** * 大写Long 转string( 如果java使用的是Long包装类) 用于响应请求 */
        simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
/** * 序列换成json时,将所有的long变成string * 因为js中字符转长整型时可能是long基本类型 */
        simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
        objectMapper.registerModule(simpleModule);
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        objectMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
        jackson2HttpMessageConverter.setObjectMapper(objectMapper);
        converters.add(jackson2HttpMessageConverter);
    }

还有一种是配置式:

在配置文件中设置如下参数

#该设置将会影响全部数字类型的字段
spring.jackson.generator.write-numbers-as-strings=true
spring.jackson.date-format="yyyy-MM-dd HH:mm:ss"
你好!关于QJsonObject存储long long类型丢失精度问题,我可以为你提供一些建议。 在Qt中,QJsonObject是用来存储JSON对象的类。然而,QJsonObject的value函数返回的是QJsonValue类型,它只能存储一些基本数据类型,如字符串、整数、浮点数等,并不支持long long类型。 如果你需要存储long long类型的数据并保持精度,可以考虑以下两种方法: 1. 将long long类型转换为字符串进行存储:你可以使用QString::number()函数将long long类型转换为字符串,然后将其作为QJsonValue存储在QJsonObject中。在需要使用该值时,可以使用QString::toLongLong()函数将其还原为long long类型。 示例代码如下: ```cpp QJsonObject jsonObject; long long value = 1234567890123456789LL; jsonObject["key"] = QString::number(value); // 从QJsonObject中获取存储的值 QString stringValue = jsonObject["key"].toString(); long long restoredValue = stringValue.toLongLong(); ``` 2. 自定义数据类型:如果你需要频繁地存储和读取long long类型的数据,可以考虑创建一个自定义的数据类型,将其转换为可序列化的形式,并在需要时进行反序列化。 示例代码如下: ```cpp struct LongLongData { qint64 value; // 序列化 QJsonObject toJson() const { QJsonObject json; json["value"] = QString::number(value); return json; } // 反序列化 static LongLongData fromJson(const QJsonObject& json) { LongLongData data; data.value = json["value"].toString().toLongLong(); return data; } }; // 使用自定义数据类型 QJsonObject jsonObject; LongLongData data; data.value = 1234567890123456789LL; jsonObject["key"] = data.toJson(); // 从QJsonObject中获取存储的值 LongLongData restoredData = LongLongData::fromJson(jsonObject["key"].toObject()); long long restoredValue = restoredData.value; ``` 希望这些方法能够帮助到你!如果你还有其他问题,请随时提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值