2015-07-10 46 views
0

我正在使用JSON Path parser解析某些数据。这里是源数据的一个例子:使用第一个对象的值在第二个对象中查找对应的值

{ 
"people": [ 
    { 
     "initials": "RF", 
     "sport": "T" 
    }, 
    { 
     "initials": "LM", 
     "sport": "F" 
    } 
], 
"definitions": { 
    "RF": { 
     "def_1": "Roger Federer", 
     "def_2": "Roger" 
    }, 
    "LM": { 
     "def_1": "Lionel Messi", 
     "def_2": "Lionel" 
    }, 
    "T": { 
     "def_1": "Tennis" 
    }, 
    "F": { 
     "def_1": "Football" 
    } 
} 
} 

现在,如果我只使用数组(people),这几乎是无用的,RFT没有多大的意义。但是,在对象(definitions)中定义了它们。 RF意味着Roger FedererTTennis,所以我需要导入这两个。我可以轻松导入RFT,但我正在努力寻找连接RFTRoger FedererTennis的查询。

首先,我需要指定上下文(根),然后指定对象的名称。下面是一个例子:

Context: $.[] 
Query: initials 
Result is: RF 

当我导入所有的这在一个节点,本实施例能很好地导入阵列(people)数据。

这是我能成功,现在导入:

Field1 value: RF 
Field2 value: T 

我需要什么:

Field1 value: RF 
Field2 value: T 
**Field4 value: Roger Federer** 
**Field5 value: Tennis** 

基本上,我想更好地描述我从people阵列获得。这是我尝试过的组合之一,但它不起作用:

Context: $.[] 
Query: initials.def_1 
Query: people.initials.def_1 

有没有办法实现这一点?

回答

1

对于这样一个简单的数据结构,XPath听起来像是过度杀毒。也许还有其他原因需要使用XPath,但在纯JavaScript中这非常简单。例如:

var data = { 
    "people": [ 
     { 
      "initials": "RF", 
      "sport": "T" 
     }, { 
      "initials": "LM", 
      "sport": "F" 
     } 
    ], 
    "definitions": { 
     "RF": { 
      "def_1": "Roger Federer", 
      "def_2": "Roger" 
     }, 
     "LM": { 
      "def_1": "Lionel Messi", 
      "def_2": "Lionel" 
     }, 
     "T": { 
      "def_1": "Tennis" 
     }, 
     "F": { 
      "def_1": "Football" 
     } 
    } 
}; 

data.people.forEach(function(person) { 
    var name = data.definitions[person.initials].def_1; 
    var sport = data.definitions[person.sport].def_1; 
    console.log(name, 'plays', sport); 
}); 

日志:

Roger Federer plays Tennis 
Lionel Messi plays Football 
+0

啊,罗杰说。我在你的问题中添加了一个xpath标签来帮助XPath专家发现它。 –

+0

谢谢你的回答。我使用的是XPath,因为我使用的CMS(Drupal)有一个很好的模块,它利用XPath并定期分析特定URL中的数据。由于它使得整个集成比自定义解决方案更容易,所以如果有可能,我宁愿使用XPath。 – take2

相关问题