在不知道键名的情况下访问 JSON 对象的元素

Posted

技术标签:

【中文标题】在不知道键名的情况下访问 JSON 对象的元素【英文标题】:Accessing elements of JSON object without knowing the key names 【发布时间】:2011-07-04 02:03:48 【问题描述】:

这是我的 json:

"d":"key1":"value1",
      "key2":"value2"

有什么方法可以在不知道键是什么的情况下访问此数组中的键和值(在 javascript 中)?

我的 json 结构像这样的原因是我通过 jquery 调用的 webmethod 正在返回一个字典。如果无法使用上述方法,我需要对返回数据的方式进行哪些更改?

这是我的网络方法的概要:

<WebMethod()> _
Public Function Foo(ByVal Input As String) As Dictionary(Of String, String)
    Dim Results As New Dictionary(Of String, String)

    'code that does stuff

    Results.Add(key,value)
    Return Results
End Function

【问题讨论】:

“访问此数组中的键和值(在 javascript 中)” - 什么数组..? 【参考方案1】:

您可以使用for..in 构造来遍历对象的任意属性:

for (var key in obj.d) 
    console.log("Key: " + key);
    console.log("Value: " + obj.d[key]);

【讨论】:

完美。如果只有一个键值对,我还需要使用for in吗? @Radu 您无法使用索引访问对象的属性,因此您需要使用 for...in 获取键。 如果 JSON 中有一个对象列表并且您想获取对象名称怎么办?像 "d":"key1":"value1","key2":"value2","e":"key1":"value1","key2":"value2" 你想要名字d 和 e,但你不知道它们在运行时被称为 d 和 e。 您可能需要在内部使用obj.d.hasOwnProperty(key) for block 以摆脱内部私有属性。 这为我节省了 6 个多小时的搜索时间。与火力树中的深层子级配合良好。【参考方案2】:

这是你要找的吗?

var data;
for (var key in data) 
   var value = data[key];
   alert(key + ", " + value);

【讨论】:

提示:不要将 JavaScript 对象称为 JSON 对象。 JSON 是传输格式。解析后,没有 JSON。 提示2:一种更简洁的警告多个值的方法:alert([key, value]) @Ates Goral 我对 var 名称的暗示是它包含 JSON 数据,而不是 JSON 对象。我想这是个糟糕的选择。 谢谢。接受了另一个答案,因为它对我的 json 数据进行了更好的调整。 @Radu 不客气,没问题。很高兴我们能为您提供帮助。【参考方案3】:

  "d":
     "key1":"value1",
     "key2":"value2"
    

访问第一个键写入:

   let firstKey=Object.keys(d)[0];

要访问第一个键写入的值:

let firstValue= d[firstKey];

【讨论】:

【参考方案4】:

通过使用单词“b”,您仍在使用键名。

var info = 
"fname": "Bhaumik",
"lname": "Mehta",
"Age": "34",
"favcolor": "color1":"Gray", "color2":"Black", "color3":"Blue"
;

看下面的sn-p。

for(key in info) 
  var infoJSON = info[key];
  console.log(infoJSON);

结果是,

Bhaumik
Mehta
Object color1: "Gray", color2: "Black", color3: "Blue" 

不想显示最后一行?试试下面的代码:

for(key in info) 
  var infoJSON = info[key];
    if(typeof infoJSON !== "object")
       console.log(infoJSON);
  

这将消除Object color1: “Gray”, color2: “Black”, color3: “Blue” 在控制台中的显示。

现在我们需要遍历变量 infoJSON 来获取数组值。看看下面的整个和平的代码。

for(key in info) 
    var infoJSON = info[key];
    if (typeof infoJSON !== "object")
       console.log(infoJSON);
    
 

for(key1 in infoJSON) 
    if (infoJSON.hasOwnProperty(key1)) 
       if(infoJSON[key1] instanceof Array) 
          for(var i=0;i<infoJSON[key1].length;i++) 
             console.log(infoJSON[key1][i]);
          
         else console.log(infoJSON[key1]);
    
 

现在我们得到了结果

Bhaumik
Mehta
Gray
Black
Blue

如果我们使用键名或 id,那么很容易从 JSON 对象中获取值,但这里我们在不使用键名或 id 的情况下获取值。

【讨论】:

【参考方案5】:

使用 for 循环来达到同样的效果。

var dlist =  country: [ 'ENGLAND' ], name: [ 'CROSBY' ] 

for(var key in dlist)
     var keyjson = dlist[key];
     console.log(keyjson)
   

【讨论】:

以上是关于在不知道键名的情况下访问 JSON 对象的元素的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Angular 在 HTML 中访问没有键名的数组对象

如何解析具有动态键名的嵌套 json

更改没有键名的json值

Joi 对象验证:如何验证具有未知键名的值?

如何访问 Json 数据

如何反序列化具有动态(数字)键名的子对象?