首页 > 解决方案 > Angular 8 JSON.parse 没有完全/公正地解析

问题描述

我收到一个如下所示的 JSON 对象:此数据正在通过 Socketio 发射传递,因此角度 HttpClient 不会拦截它。

{
  "single":[
    {
      "name":"Xavi555",
      "data":[
        {
          "_id":"5e2ea609f8c83e5435ebb6e5",
          "id":"test1",
          "author":"someone",
          "recipient":"someone",
          "content":"test",
          "msgId":"Testid",
          "gNamespace":""
        }
      ]
    }
  ],
  "group":[]
}

但是,当我JSON.parse()在上面的对象上使用时,键data不包含该值,data也就是说:

private func(jsonObj: string): void {
  console.log(jsonObj);
}

我懂了:

single: Array(1)
groups: Array(0)
single Array(1)
  name: test
  data: Array(0)

我认为这是深度克隆的问题,但是,当尝试这样做时,JSON.parse(JSON.stringify(jsonObj))它会返回原始的 json 字符串对象。 相关但未发布解决方案

截屏 实际代码:

private handleStoredMessages(dirtyObj: string): void {
  // debugger;
  const cleanObj = JSON.parse(dirtyObj);
   const { single, group } = cleanObj;

   console.log('raw json', dirtyObj);
   onsole.log('clean json', cleanObj);
}

有任何想法吗?

标签: jsonangular

解决方案


如果您使用的是角度,那么我怀疑您应该使用JSON.parse. 这是由HttpClient. 然而,您对数据结构的假设是错误的。是一个对象数组,而single不是对象本身:

所以要访问.data你需要做的jsonObj.single[0].data。它本身又是一个数组


发生这种情况的唯一其他原因是,在您实际按下控制台中的三角形打开对象之前,您在代码中的其他位置修改了对象/数组。将鼠标悬停在蓝色信息图标上以查看原因。

下面的值是刚才评估的

对象被延迟评估,这意味着如果您对对象进行任何转换,它将显示该状态,而不是您记录该对象时的状态。


推荐阅读