这是我的JSON,我想直接从JSON获取zipCodes值而不循环访问JSON。我该怎么办?
countries:[
{
name:'India',
states:[{
name:'Orissa',
cities:[{
name:'Sambalpur',
zipCodes:{'768019','768020'}
}]
}]
}
]
答案 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.parse
或JSON.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