在HarmonyOS开发中Long类型精度丢失问题?使用JSON.parse解析json数据时,Long类型的数据会出现精度丢失,请问可以怎么处理?尝试使用三方库JsonBigInt,则在转换的字符串后会多出一个“n”。PS“服务端因三端都要用,输出类型不能变更为string类型
本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。
在HarmonyOS开发中Long类型精度丢失问题?使用JSON.parse解析json数据时,Long类型的数据会出现精度丢失,请问可以怎么处理?尝试使用三方库JsonBigInt,则在转换的字符串后会多出一个“n”。PS“服务端因三端都要用,输出类型不能变更为string类型
本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。
在HarmonyOS开发中处理Long类型精度丢失问题时,使用`JSON.parse`解析JSON数据时确实可能会遇到Long类型数据精度丢失的情况。这是因为JavaScript中Number类型的精度限制导致的。为了解决这个问题,你可以考虑以下几种方法:
1. **使用BigInt**:
虽然你提到使用`JsonBigInt`库时会在转换的字符串后多出一个“n”,但这通常是因为转换逻辑或使用方法有误。`BigInt`是JavaScript中用于表示任意精度整数的类型。你可以检查`JsonBigInt`库的文档,确保正确使用它,或者自己实现一个基于`BigInt`的解析逻辑。
示例代码(假设`JsonBigInt`库使用正确):
const JsonBigInt = require('json-bigint');
const jsonString = '{"longValue": 9223372036854775807}';
const parsedData = JsonBigInt.parse(jsonString);
console.log(parsedData.longValue.toString()); // 确保转换为字符串时不会有多余的字符
2. **在服务端处理**:
如果服务端可以控制输出格式,并且三端(包括HarmonyOS)都需要使用,可以考虑在服务端将Long类型的数据转换为字符串形式再输出。虽然你提到输出类型不能变更为string类型,但如果这是唯一可行的方法,可能需要与三端的其他开发者协商,共同确定一个统一的数据格式。
3. **自定义解析逻辑**:
如果不使用第三方库,也可以自己编写解析逻辑,将Long类型的数据以字符串形式解析出来,并在需要时转换为JavaScript的Number类型(但注意精度限制)。
示例代码:
function parseJsonWithLong(jsonString) {
return JSON.parse(jsonString, (key, value) => {
if (typeof value === 'string' && !isNaN(value) && value.length > 15) { // 假设Long类型数据长度大于15
return BigInt(value);
}
return value;
});
}
const jsonString = '{"longValue": "9223372036854775807"}'; // 注意这里Long值已经是字符串
const parsedData = parseJsonWithLong(jsonString);
console.log(parsedData.longValue.toString()); // 使用BigInt处理后的值
注意:上述自定义解析逻辑需要确保JSON中Long类型的数据是以字符串形式提供的,这可能需要与服务端协商数据格式。
综上所述,处理HarmonyOS开发中Long类型精度丢失问题的关键在于确保在解析JSON数据时能够正确处理Long类型的数据。使用`BigInt`或自定义解析逻辑是两种常见的方法。如果这些方法仍然无法满足需求,可能需要考虑与服务端协商更改数据格式或寻找其他解决方案。
1 回答925 阅读✓ 已解决
1 回答1.2k 阅读
1 回答1k 阅读
1 回答990 阅读
1 回答963 阅读
1 回答853 阅读
1 回答820 阅读
在使用三方库JsonBigInt的时候,使用JsonBigInt.stringify()来序列化,JsonBigInt.parse()来反序列化//带n后缀表明是bigint类型,属于js基本类型,可以直接使用。可以参考:前端统一类型为String,后端不变 let json = ‘{“id”:4323455642279246233}’; json = json.replace(/“id”\d+)/g,’“id”: “$1”’); 前端收到json字符串,使用正则表达式把id从数值改为字符串,以避免丢失精度。//JsonBigInt.parse () as后的跟的是是要转换的类型,as转换类型不匹配会报错的。bigint不可以直接赋值给string类型,也是需要将bigint类型的数据转化为字符串。
本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。