访问JSON中的嵌套值而不循环遍历它

时间:2015-06-20 08:18:50

标签: javascript json

这是我的JSON,我想直接从JSON获取zipCodes值而不循环访问JSON。我该怎么办?

countries:[
             {
               name:'India',
               states:[{
                           name:'Orissa',
                           cities:[{
                                      name:'Sambalpur',
                                      zipCodes:{'768019','768020'}
                                  }]
                      }]
             }
             ]

5 个答案:

答案 0 :(得分:1)

我认为你在寻找

            MultipartRequest multi = new MultipartRequest(request,appPath,10*1024*1024); // 10MB
            Enumeration params = multi.getParameterNames();
             while (params.hasMoreElements()) 
            {
                paramname = (String) params.nextElement();

                if(paramname.equalsIgnoreCase("cname"))
                {
                    Class=multi.getParameter(paramname);
                }

                if(paramname.equalsIgnoreCase("pno"))
                {
                    phone=multi.getParameter(paramname);
                }
                if(paramname.equalsIgnoreCase("fee"))
                {
                    fee=multi.getParameter(paramname);
                }

                if(paramname.equalsIgnoreCase("fname"))
                {
                    image=multi.getParameter(paramname);
                }

                if(paramname.equalsIgnoreCase("fname1"))
                {
                    image1=multi.getParameter(paramname);
                }
            }

请注意,这适用于上述JSON,因为国家/地区阵列中只有1个国家/地区,且状态和城市相同。但是,如果有超过1个国家,州或城市,那么除非您知道确切的索引,否则必须进行迭代才能提取信息。

答案 1 :(得分:1)

由于这不是关联数组,因此您的选择只是使用这样的索引:

countries[x].states[y].cities[0].zipCodes

其中x将是数组中状态的每个表示,当然,如果您有多个状态。

同样y将是每个国家/地区的每个州,如果您有更多这样的州,如果您需要,您可以为城市执行相同操作。

编辑: 以下是如何迭代数组:

for(var c in countries)
{
     var name = countries[c].name;
     if (name === "CountryIAmLookingFor")
     {
         var statesList = countries[c].states;
         for (var s in statesList)
         {
             var stateName = statesList[s].name;
             .....
         }
     }
}

您可以继续迭代,直到找到所需的国家/地区,州和城市,然后从那里提取zipCodes,如上一个代码段所示。

答案 2 :(得分:1)

这是我避免显式迭代的“技巧”。让JSON.parseJSON.stringify为您完成工作。如果您的JSON是字符串形式,请尝试:

var array = [];

JSON.parse(jsonString, function (key, value) {
    if (key === "zipCodes") {
        array = array.concat(value);
    }

    return value;
});

console.log(array); // all your zipCodes

答案 3 :(得分:0)

没有“循环”

你可以做这个疯狂的技巧(不是说这是最好的方法,但这样你就不会循环使用JSON)

var myData = { 'Put Your Data': 'HERE' };
function getCodes(name, data) {
    var sv = data.match(new RegExp(name+'([\\S\\s]*?}][\\S\\s]*?}])'))[1].match(/zipCodes":\[(.*?)\]/g), r = [];
    sv.forEach(function (item) {
        item.match(/\d+/g).forEach(function (sub) {
            r.push(+sub);
        });
    });
    return r;
}
getCodes('India', JSON.stringify(myData));

如果您的数据已经是字符串,那么您不需要JSON.stringify。您看到的forEach实际上并没有通过JSON“循环”。它已经提取了邮政编码,代码只是将邮政编码添加到数组中。 。这一行:

var sv = JSON.stringify(data).match(new RegExp(name+'([\\S\\s]*?}][\\S\\s]*?}])'))[1].match(/zipCodes":\[(.*?)\]/g), r = [];

是抓取邮政编码的东西,它有类似的东西:

["zipCodes":["768019","768020"]"]

下一行:

item.match(/\d+/g)

将获取输出数字的数字:

["768019", "768020"]

循环只是将邮政编码添加到另一个数组

使用循环

最好循环使用JSON:

var myData = {}, // Your data
    zips   = [];

myData.countries.forEach(function(i) {
    if (i.name === 'India') {
        i.states.forEach(function(j) {
            j.cities.forEach(function(l) {
                l.zipCodes.forEach(function(m) {
                    zips.push(m);
                });
            });
        });
    }
});

//use "zips" array

性能和速度测试

在测试复制阵列 500MB (半场演出)后,花了大约 30秒。好多啊。考虑到一个非常大的JSON大概约为5MB,循环一点点 5MB 的JSON大约需要 0.14秒。你永远不应该担心速度。

答案 4 :(得分:0)

假设您的Json就像

var finalOP = countries.map(function(s){
   var Stalist = s.states.map(function(c){
      var zip = c.cities.map(function(z){

         return z.zipCodes
      })
      return zip
    })
     return Stalist 
})

console.log(finalOP)

所以现在我们使用MAP它会给你每个城市的ZipCode

  Intent intent = new Intent();
              intent.setType("image/*");
              intent.setAction(Intent.ACTION_GET_CONTENT);

如果您使用return语句,那么它将为您提供2个数组,其中包含两个基于JSON的邮政编码

main_activity