HarmonyOS 鸿蒙Next JSON.parse()转换问题
HarmonyOS 鸿蒙Next JSON.parse()转换问题
JSON字符串用JSON
.parse()转换成对象后,再用JSON
.stringify()转换过来会丢失一部分数据,是为什么?
代码:
控制台打印的结果:
PS:这个问题是在使用’@ohos.net.http’请求后端数据时发现的问题,而且发现当expectDataType设置为http.HttpDataType.OBJECT时也出现了数据丢失的问题。
更多关于HarmonyOS 鸿蒙Next JSON.parse()转换问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html
要是后端不让改数据格式(其它端都用着正常,不能改),怎么个解法?唉
更多关于HarmonyOS 鸿蒙Next JSON.parse()转换问题的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
数字作为Key的转换问题解决了么?我也遇到了同样的问题。只要是数字作为key的,就只出来第一个,其它的就都丢了。
test() {
let sss = `{
"types": {
"2015": [ 1, 2 ],
"2016": [ 1, 2 ],
"2017": [ 1, 2 ]
}
}`
let aaa = JSON.parse(sss)
let bbb = aaa["types"]["2015"][0] // 可以正常读取到 1
let ccc = aaa["types"]["2016"][0] // 直接崩了。
}
我这里测着是没问题的,是不是华为已经修复了
希望HarmonyOS能继续优化系统稳定性,减少崩溃和重启的情况。
我看了一下你用的是IDE内置的预览器,我去试了一下确实可以了,我有用我的平板试了一下也可以了,但是运行到本地模拟器上问题还存在(我之前一直没用内置预览器是因为我觉得它的屏太小了,哈哈)。我猜应该是新版本的SDK修复了这个问题,而本地模拟器用的还是旧版SDK,总之谢谢你提供的思路!
我刚试了下是可以的,不过转map 的时候你要通过 替代器 replacer 处理下
class AreaData {
area_list: Map<string, string>
}
class CityResponse {
code: number = 0
msg: string = ""
data: AreaData = new AreaData()
}
let data = new CityResponse()
data.code = 1
data.data = new AreaData()
data.data.area_list = new Map()
data.data.area_list.set("110000", "北京市")
data.data.area_list.set("120000", "天津市")
data.data.area_list.set("310100", "上海市")
data.data.area_list.set("440100", "广州市")
data.data.area_list.set("440300", "深圳市")
let map = new HashMap<string, string>()
map.set("110000", "北京市")
Logger.debug("jsonStr1=" + JSON.stringify(map))
Logger.debug("jsonStr3=" + JSON.stringify(Object.fromEntries(map)))
Logger.debug("jsonStr4=" + JSON.stringify(Object.fromEntries(data.data.area_list)))
Logger.debug("jsonStr7=" + JSON.stringify(data, (key: string, value: any) => {
Logger.debug("jsonStr6=" + key)
Logger.debug("jsonStrValue=" + JSON.stringify(value))
if (key === "area_list") {
Logger.debug("jsonStr5=" + value)
return JSON.stringify(Object.fromEntries(value))
}
return value
}))
感谢你提供的思路,我去试一下。但是我用JSON.parse()转换这个对象包对象的数据是出现了转换后数据丢失问题,是不是说明他的JSON.parse()存在一些bug呢?
这个应该是js 的问题,我用ts 试了下,只要是数字作为key 就不得行,换成非数字字符串就可以,
可以封装一个对象去接呀,把area_list 用map去接就得行
代码:
@Entry
@Component
struct Index {
@State data: string = '{"code":1,"msg":"","data":{"area_list":{"110000":"北京市","310100":"上海市","120000":"天津市","440300":"深圳市","440100":"广州市"}}}'
build() {
Row() {
Column() {
Flex({ direction: FlexDirection.Column }) {
Text(this.data)
Text('==========================')
// 将JSON字符串转换成对象后取键为110000的值 => 北京市
Text(JSON.parse(this.data).data.area_list['110000'])
Text('==========================')
// 将JSON字符串转换成对象后取键为310100的值 => 理论上应该显示上海市,但实际没显示,说明这一项没有了
Text(JSON.parse(this.data).data.area_list['310100'])
Text('==========================')
// 将JSON字符串转换成对象后再转回来
Text(JSON.stringify(JSON.parse(this.data)))
}
}
.width('100%')
}
.height('100%')
}
}
运行结果:
JavaScript 运算符
优先级 | 运算符 | 说明 | 结合性 |
---|---|---|---|
1 | [] 、. 、() |
字段访问、数组索引、函数调用和表达式分组 | 从左向右 |
area_list[‘110000’] 会把这个看成一个整体 当然错误了, |
什么意思? 我area_list[‘110000’]取到值了呀? 是另一个没取到值。说明JSON.parse()之后没这个值了呀,
这是控制台打印显示问题,控制台显示长度好像是有限制的,如果你觉得还是JSON.stringify() 问题,可以把转为字符串显示到文本组件或文本域组件看看。
我觉得问题出在 JSON.parse()
上,因为我 JSON.parse()
后直接取后面的值取不到,详请请看我下面的回答。
应该不是打印的问题,超过长度的话是切片显示的,不会出现数据丢失,他发的日志上字符串后面有大括号结尾,
json.parse() 有问题,你可以看这个说明。不要随便质疑,毕竟那么多人用。
后台返回的这些数据不是json格式的数据吧 ,是不是应该用{“name”:“北京”,“code”:“110000”},{“name”:“上海”,“code”:“110000”} 这样的数据解析
对象包对象不算吗? 我在其它IDE里面转换没问题呀。
110000: 北京市
120000: 天津市
310100: 上海市
440100: 广州市
440300: 深圳市
那可能是鸿蒙的问题吧 你这个area_list不是对象吧, area_list包着应该用[],你改改这个json的格式 控制台就能全部打印出来,
area_list是对象呀,键是城市代码,值是城市名称,后端是这样返回的,我现在只能让后端给我改成数组包对象的格式了,
在HarmonyOS鸿蒙Next中,JSON.parse()
用于将JSON字符串转换为JavaScript对象。该函数在处理JSON字符串时,要求字符串格式必须严格符合JSON规范,否则会抛出SyntaxError
异常。常见的问题包括:
- JSON字符串格式错误:例如,键名未使用双引号、字符串中的双引号未转义、末尾有多余的逗号等。
- 不支持的数据类型:JSON标准不支持
undefined
、function
、Symbol
等数据类型,若JSON字符串中包含这些类型,解析时会报错。 - 大整数精度丢失:JavaScript的
Number
类型无法精确表示大整数,可能导致精度丢失。
示例:
let jsonString = '{"name": "HarmonyOS", "version": 3}';
let obj = JSON.parse(jsonString); // 正常解析
若JSON字符串格式错误:
let invalidJsonString = '{name: "HarmonyOS"}'; // 键名未使用双引号
let obj = JSON.parse(invalidJsonString); // 抛出SyntaxError
确保JSON字符串格式正确,以免解析失败。