2017-02-09 57 views
0

我是初学者,正如我开始增加JSON的复杂性,我开始通过访问来迷惑自己。我如何访问以下JSON?我想访问服务如何接取一个复杂的JSON

{ 
    employers:{ 
    Mike: { 
     old: 20, 
     services:{ 
     cut : { 
      value : 10 
     } 
     hair_straightening : { 
      value: 20 
     } 
     } 
    } 
    Penny: { 
     old: 20, 
     services:{ 
     cut : { 
      value : 10 
     } 
     hair_straightening : { 
      value: 20 
     } 
     } 
    } 
    } 
} 
+0

存储'employes'及其'services'?循环访问数据将变得更加容易! –

+2

那么,对于初学者来说,这不是JSON,这就是亲切地称为POJO(Plain Old Javascript Object)的东西。要获取对象的键列表,您可以调用Object.keys(myObj);并访问属性值,可以通过点('.')语法或括号('[]')静态地访问它们。语法 – mhodges

+0

@mhodges我认为'POJO'应该是一个标准。我已经看到很多人称POJO,JSON。 –

回答

2

每个人都有开始的地方:)

我不知道如果我完全理解你以后在做什么,但在这里不用...

首先,它看起来像你的对象上的符号是巧妙地关闭列出你的钥匙时。例如,在Mike和Penny之间,你应该用逗号分隔较大雇主对象中的每个键。

喜欢的东西:

employers: { 
    Mike: { 
     ... 
    }, //need a comma here 
    Penny: { 
     ... 
    } 
} 

而且,在每个那些雇主,应该有剪切和hair_straightening按键之间的逗号。

 services: { 
      cut: { 
       value: 10 
      }, //need a comma here 
      hair_straightening: { 
       value: 20 
      } 
     } 

现在你的实际问题... 要获得每个服务的钥匙,你可以使用Object.keys()。这个功能可以让你获得给定雇主的钥匙。然后你也可以从同一个函数中获取值。 (注意:这是只有一个雇主,你只是想遍历并都使用相同的功能上的每个)

function getServices(employer) { 
    var services = employer.services; 
    var servicesKeys = Object.keys(services); 
    var serviceValueMatrix = []; 
    servicesKeys.forEach(function(service) { 
    serviceValueMatrix.push([service, employer.services[service].value]) 
    }) 
    return serviceValueMatrix; 
} 
// assuming you had var yourJSON = { employers: {...} } 
// getServices(yourJSON.employers.Mike); 
// returns [["cut",10], ["hair_straightening",20]] 

此外,考虑到您的JSON对象是已经在关键:值的格式,你可以可能跳过最后一组对象中的值的格式为:10,值:20等,而不是只让你的对象有点像最后一层:

services:{ 
    cut: 10, 
    hair_straightening: 20 
} 

然后,你可以随便抓services.cut服务.hair_straightening。下面

的完整代码为清楚:你为什么不使用数组

const yourJSON = { 
    employers: { 
     Mike: { 
      old: 20, 
      services: { 
       cut: { 
        value: 10 
       }, 
       hair_straightening: { 
        value: 20 
       } 
      } 
     }, 
     Penny: { 
      old: 20, 
      services: { 
       cut: { 
        value: 10 
       }, 
       hair_straightening: { 
        value: 20 
       } 
      } 
     } 
    } 
} 

function getServices(employer) { 
    var services = employer.services; 
    var servicesKeys = Object.keys(services); 
    var serviceValueMatrix = []; 
    servicesKeys.forEach(function(service) { 
    serviceValueMatrix.push([service, employer.services[service].value]) 
    }) 
    return serviceValueMatrix; 
} 

console.log(getServices(yourJSON.employers.Mike)); 
// returns [["cut",10], ["hair_straightening",20]] 
+0

控制台日志是“Uncaught TypeError:无法转换未定义或null对象在Function.keys()” –

+0

只是再次测试了代码,它适用于我。我刚添加完整的解决方案以供参考。 –

+0

非常感谢你[ –

0

的价值和键可以使用Object.keys获取对象的键作为一个数组,然后可以循环通过很好。

// in this case json is a variable representing your parsed data 
Object.keys(json).map(function(key) { 
    console.log(json[key]) 
    return json[key].services 
}) 

这会给你一个服务对象的数组。

1

您的JSON应该是这个样子:

{ employers:[ { name: "Mike", age: 20, services: [ {name:"cut",value:10}, {name:"hair_straightening",value:20} ]
},{ name: "Penny", age: 20, services: [ {name:"cut",value:10}, {name:"hair_straightening",value:20} ]
} ] }

+0

我该如何获取这种格式的服务? –

+0

此JSON分配给像VAR JSON可变= yourjson 然后非常简单的访问:json.employers [0]。服务将给你从迈克 服务,你也可以迭代通过json.employers像在从shadymoses回答 – circa94