如何在Javascript中使用字符串来验证两个单独的JSON字典中的数据?
我需要解析一个JSON文件中的数据,以便验证第二个JSON文件中的数组、键和值。例如,我有一个JSON文件,其中填充了以下格式的数据:如何在Javascript中使用字符串来验证两个单独的JSON字典中的数据?,javascript,string,json,Javascript,String,Json,我需要解析一个JSON文件中的数据,以便验证第二个JSON文件中的数组、键和值。例如,我有一个JSON文件,其中填充了以下格式的数据: { "someData":["array", "key", "value"] } 我有第二个JSON文件,其中包含如下数据: { "fruit": [ {"type":"apple"}, {"type":"cherry"}, {"type":"pear"} ] } { "someData":["fruit
{ "someData":["array", "key", "value"] }
我有第二个JSON文件,其中包含如下数据:
{ "fruit": [ {"type":"apple"},
{"type":"cherry"},
{"type":"pear"} ] }
{ "someData":["fruit", "type", "pear"] }
我需要做的是从第一个JSON文件中获取数据,并使用它来验证第二个JSON文件中的数据。假设我的“someData”JSON如下所示:
{ "fruit": [ {"type":"apple"},
{"type":"cherry"},
{"type":"pear"} ] }
{ "someData":["fruit", "type", "pear"] }
我如何创建一个直接的javascript函数来确定第二个JSON字典中是否存在一个名为“type”的键和一个名为“pear”的值的“fruit”数组?我想我真正想问的是,如何使用第一个JSON字典中的字符串来访问第二个JSON字典中的数据?您可以直接访问对象的属性,也可以通过字典符号动态访问对象的属性(如果名称为字符串): 比如:
function isArray(o)
{
if((typeof o) != 'object')
return false;
if(o.length == undefined)
return false;
return true;
}
var first;
var second;
// read them...
var foundFruit = second[first["someData"][0]];
var aok = isArray(foundFruit);
。。。然后继续检查foundFruit内部的内容,依此类推?总体思路是检查数组项/对象属性并找到匹配的元素 以下示例将帮助您完成以下任务:
function validate(data, query){
var currentData = data;
var counter = 0;
var foundMatch = false;
while (counter < query.length){
foundMatch = false;
if (currentData instanceof Array){
// 1. key points to an array
if (counter < query.length){
var key = query[counter];
var i;
for (i = 0; i < currentData.length; i++){
var item = currentData[i];
if (counter === query.length - 1){
foundMatch = item === query[counter];
if (foundMatch){
counter++;
break;
}
} else if (item.hasOwnProperty(key)){
if (counter < query.length - 2){
currentData = item[key];
foundMatch = true;
counter++;
} else {
foundMatch = item[key] === query[counter + 1];
if (foundMatch){
counter += 2;
break;
}
}
}
if (foundMatch) {
break;
}
}
} else {
foundMatch = false;
break;
}
} else if (counter === query.length - 1){
// 2. key points to the last item
foundMatch = currentData === query[counter];
counter++;
} else {
if (currentData.hasOwnProperty(query[counter])){
// 3. key points to an object
currentData = currentData[query[counter]];
foundMatch = true;
counter++;
}
}
if (!foundMatch){
break;
}
}
return foundMatch;
}
var query = ["fruit", "type", "pear"];
var data = {"fruit": [{"type":"apple"}, {"type":"cherry"}, {"type":"pear"} ] };
// some other test data
//var query = ["fruit", "val", "anotherArray", 42];
//var data = {"fruit": [{"type":"apple"}, {"val":{anotherArray:[1,2,42]}}, {"type":"pear"} ] };
console.log(validate(data, query));
函数验证(数据、查询){
var currentData=数据;
var计数器=0;
var foundMatch=false;
while(计数器
你的问题引起了我的兴趣,所以我在JSFIDLE中尝试了一下。我认为这应该可以很好地工作,并且代码有点简短(sans注释)。唯一需要注意的是,它实际上不进行任何类型检查,如果“fruit”不是数组,或者如果“fruit”数组中的各种项不是正确的对象,则可能会出错,因为“someData”不是数组。但我不想让代码过于复杂,我只是假设您将确保JSON格式与您的示例匹配
var checkFor={
“someData”:[“水果”、“类型”、“梨”],
“someMoreData”:[“水果”、“颜色”、“有机玻璃”],
“evenMoreData”:[“蔬菜”、“类型”、“菠菜”],
“lastBitOfData”:[“蔬菜”、“颜色”、“绿色”]
};
var签入={
“水果”:[
{“类型”:“苹果”,“颜色”:“红色”},
{“类型”:“樱桃”,“颜色”:“红色”},
{“类型”:“梨”,“颜色”:“绿色”}],
“蔬菜”:[
{“类型”:“花椰菜”,“颜色”:“绿色”},
{“类型”:“番茄”,“颜色”:“红色”},]
};
//循环检查checkFor中的所有键,并查看它们是否存在于checkIn中
for(checkFor中的变量名称){
/*
键(将是“someData、someMoreData、evenMoreData等”,没有特定顺序
抓取checkFor的每个键(名称)并将其分配给变量(arr)
将arr的索引0、1、2分别分配给parentKey、key和value
*/
var arr=checkFor[name],parentKey=arr[0],key=arr[1],value=arr[2];
//检查是否有错误
var exists=forExistsIn(签入、parentKey、key、value);
//写出我们的结果
document.write(name+“(“+arr+”)存在于checkIn=>“+exists+”
”)中;
}
/*
检查obj中的parentKey,然后检查
确保obj[parentKey]至少包含一个子对象
“键”=“值”
*/
函数forexistin(对象、父键、键、值){
返回对象的类型[parentKey]!=“未定义”&&
obj[parentKey]。筛选器(函数(项){
返回项[键]==值;
}).长度>0;
}
我可以建议验证你的代码吗?同样,在你的<代码> /<代码>子句中,也许你可以考虑<代码> IF(item .HasObjor属性(key)){/**/Reals=项[Key ]== Val.;/**/Burk;/**/}。
而不是for循环?谢谢。刚刚习惯了在属性中循环。这里当然可以没有循环。如果水果
数组为空,它会通过验证还是失败?如果水果