HarmonyOS 鸿蒙Next JSON.parse()转换问题

HarmonyOS 鸿蒙Next JSON.parse()转换问题

JSON字符串用JSON.parse()转换成对象后,再用JSON.stringify()转换过来会丢失一部分数据,是为什么?

代码:

Snipaste_2024-01-06_15-48-45.png

控制台打印的结果:

Snipaste_2024-01-06_15-49-11.png

PS:这个问题是在使用’@ohos.net.http’请求后端数据时发现的问题,而且发现当expectDataType设置为http.HttpDataType.OBJECT时也出现了数据丢失的问题。


更多关于HarmonyOS 鸿蒙Next JSON.parse()转换问题的实战教程也可以访问 https://www.itying.com/category-93-b0.html

22 回复

要是后端不让改数据格式(其它端都用着正常,不能改),怎么个解法?唉

更多关于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%')
  }
}

运行结果:

Snipaste_2024-01-08_09-27-36.png

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标准不支持undefinedfunctionSymbol等数据类型,若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字符串格式正确,以免解析失败。

回到顶部