Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Javascript中使用字符串来验证两个单独的JSON字典中的数据?_Javascript_String_Json - Fatal编程技术网

如何在Javascript中使用字符串来验证两个单独的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

我需要解析一个JSON文件中的数据,以便验证第二个JSON文件中的数组、键和值。例如,我有一个JSON文件,其中填充了以下格式的数据:

{ "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循环?谢谢。刚刚习惯了在属性中循环。这里当然可以没有循环。如果
水果
数组为空,它会通过验证还是失败?如果
水果