【问题标题】:How can I reference an anonymous json array?如何引用匿名 json 数组?
【发布时间】:2014-12-09 01:17:35
【问题描述】:

我有一个从 QuickBooks Online API 返回的大型 JSON 对象。它是有效的 JSON 并显示在控制台上(在记录之后)。

在检查控制台时,我看到以下内容:

[Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object]

可以扩展为:

[Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object, Object]
0: Object
1: Object
2: Object
3: Object
4: Object
5: Object
6: Object
7: Object
8: Object
9: Object
10: Object
11: Object
12: Object
13: Object
14: Object
15: Object
16: Object
17: Object
18: Object
19: Object
20: Object
21: Object
22: Object
23: Object
24: Object
length: 25
__proto__: Array[0]

0: Object 扩展为:

0: Object
*_data: Object
$$hashKey: "object:82"
__proto__: Object

*_data: Object 扩展为:

Active: Array[1]
Balance: Array[1]
BalanceWithJobs: Array[1]
BillAddr: Array[1]
BillWithParent: Array[1]
DisplayName: Array[1]
FamilyName: Array[1]
Fax: Array[1]
FullyQualifiedName: Array[1]
GivenName: Array[1]
Id: Array[1]
Job: Array[1]
MetaData: Array[1]
Mobile: Array[1]
PreferredDeliveryMethod: Array[1]
PrimaryEmailAddr: Array[1]
PrimaryPhone: Array[1]
PrintOnCheckName: Array[1]
SalesTermRef: Array[1]
SyncToken: Array[1]
Taxable: Array[1]

我正在尝试访问名为 DisplayName 的属性。

用于控制台记录 json 数据的 Angular 代码:

$http.get('/customer').success(function(customers) {
    $scope.customers = customers;
    console.log($scope.customers[0]["*_data"].DisplayName[0]);
});

如何做到这一点?可以在控制台中输入一些东西来返回它的值吗?

更新:

我可以使用以下方法访问对象:

console.log($scope.customers[0]);

但是,*_data 是一个对象。我在想这样的事情:

console.log($scope.customers[0].*_data); 可以,但是我收到错误:

Uncaught SyntaxError: Unexpected token *.

【问题讨论】:

  • 你能用括号表示吗?喜欢<thisjson>[0]["*_data"]["DisplayName"];
  • @brbcoding,我在尝试时收到此错误:Uncaught SyntaxError: Unexpected token < 没有括号,thisjson 未定义。
  • brbcoding 并不意味着要按字面意思使用<thisjson>,只是用作存储 json 的任何变量的占位符。
  • RaphaelRafatpanah @chazsolo 说了什么。
  • 啊。 console.log($scope.customers[0]); 在控制台中返回 object。如何访问对象? console.log($scope.customers[0]["*_data"]); 返回未定义。

标签: javascript json


【解决方案1】:

您是否将其记录到控制台?

假设你是,并且你有类似的东西:

console.log(data);

您可以像这样访问数据:

data[0]["*_data"].DisplayName[0]

即:

  1. 使用data[0] 取消引用第一个数组项
  2. 然后访问*_data 属性。由于其名称不是有效的属性名称,因此您必须使用 ["string"] 表单。
  3. DisplayName 值是一个数组。用[0] 取第一个值。

编辑

好的,哇,这实际上是一个非常有趣的!

似乎响应数据包含一个奇怪的字符,这使得访问响应变得很棘手。具体来说:

> Object.keys($scope.customers[0])[0]
"*_data"
> Object.keys($scope.customers[0])[0] == "*_data"
false

嗯?为什么他们不相等?其中一个字符必须是一个 unicode char,它看起来相同但具有不同的值!

无论如何,解决这个问题很容易:

var mysteriousKey = Object.keys($scope.customers[0])[0];
var data = $scope.customers[0][mysteriousKey];

这给了我:

对象 {Id: Array[1], SyncToken: Array[1], MetaData: Array[1], GivenName: Array[1], FamilyName: Array[1]…}

我认为这是你所追求的。

【讨论】:

  • 尝试时,我收到Uncaught ReferenceError: data is not defined。它正在记录到控制台。
  • 谁将它记录到控制台?是您的代码向 QuickBooks API 发出此请求吗?
  • 是的。我有一个角度的 $http.get() 请求到我的后端,它返回 json 数据。我立即将该数据记录到控制台。我也尝试过这样做:console.log($scope.customers[0]["*_data"].DisplayName[0]); 但是,控制台返回此错误:TypeError: Cannot read property 'DisplayName' of undefined
  • 那么你已经接近了。我建议您在那里设置一个断点并检查您返回的数据。我无法从这里真正帮助你。也许属性名称是_data 而不是*_data
  • 谢谢。我在运行console.log($scope.customers[0]); 时确实收到了正确的对象,它返回Object {*_data: Object}*_data: Object__proto__: Object 也许问题是因为“*_data”是一个对象而不是一个数组?
【解决方案2】:

您的数组应该分配给一个变量。引用您想要的数组中项目的索引,并访问它的DisplayName 属性(这也是一个数组)。

var objArray; // this has your array of objects
objArray[0]["*_data"].DisplayName[0]; // should be the value you are looking for.

【讨论】:

  • 如果*_data 是一个对象呢?怎么引用?
  • @RaphaelRafatpanah *_data 即使对象会以这种方式被引用。它被称为方括号表示法,与点表示法相反。因为该属性有一个*,所以您需要使用方括号表示法。但是,如果您的财产是 _data,您可以使用 objArray[0]._dataobjArray[0]["_data"]。两者都产生相同的结果。不过,对于星号等特殊字符,最好使用方括号表示法来避免解析器错误。
  • 感谢您的帮助和解释。它不起作用的原因是 * 看起来像一个星号,但实际上在内部具有不同的值。有关详细信息,请参阅所选答案。再次感谢。
猜你喜欢
  • 2012-05-10
  • 1970-01-01
  • 1970-01-01
  • 2014-04-19
  • 1970-01-01
  • 2019-09-20
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
相关资源
最近更新 更多