Swift 3,Xcode8.2.1,
我正在尝试从项目中的json文件中提取特定值。该文件的名称是city.list.json,json文件的语法如下:
{"_id":707860,"name":"Hurzuf","country":"UA","coord":{"lon":34.283333,"lat":44.549999}}
{"_id":519188,"name":"Novinki","country":"RU","coord":{"lon":37.666668,"lat":55.683334}}
我输入的是国家/地区名称,我需要将id值或相关的国家/地区代码作为字符串返回。
我收到错误:
“输入'任何?'没有下标成员“,
我写的方法:
private func findCountryCodeBy(location: String)->String{
var result:String="";
let bundle = Bundle(for: type(of: self));
if let theURL = bundle.url(forResource: "city.list", withExtension: "json") {
do {
let data = try Data(contentsOf: theURL);
if let parsedData = try? JSONSerialization.jsonObject(with: data, options:[]) as! [String:Any] {
result = parsedData["_id"][location][0] as! String;
}
} catch {
print(error);
result = "error";
}
}
return result;
}
答案 0 :(得分:0)
这不是有效的JSON。我认为最接近的有效JSON等效项是 EITHER JSON 列表,如:
[
{"_id":707860,"name":"Hurzuf","country":"UA","coord":{"lon":34.283333,"lat":44.549999}},
{"_id":519188,"name":"Novinki","country":"RU","coord":{"lon":37.666668,"lat":55.683334}}
]
即,方括号内的列表,每个项目用逗号分隔。
或 JSON 字典:
{
"707860": {"name":"Hurzuf","country":"UA","coord":{"lon":34.283333,"lat":44.549999}},
"519188": {"name":"Novinki","country":"RU","coord":{"lon":37.666668,"lat":55.683334}}
}
是的,一个用大括号括起来的大括号内的字典(在这种情况下我用_id
作为键):
和值(所有字典的字典)其他项目"在:
之后。
(Newlines,tabs,whitespace被忽略,我只是将它们包含在内,以明确我所做的事情。)
我认为字典版本可能更适合您的代码,但这取决于您想要对数据做什么。列表可能更适合某些情况。
我写了一个快速的Python脚本来简单地从一个文件中读取JSON(而不是用它做任何其他事情),并且它为你所拥有的不完全JSON产生了一个解析错误,但它在两者上都运行良好我的JSON示例,上面。
注意:如果您无法控制正在阅读的文件的格式(即,如果您从其他任何无法以任何其他格式生成的文件来源接收它),那么您将不得不修改格式您收到它后使其成为有效JSON的文件,或者您必须使用JSONSerialization
之外的其他内容来阅读它。您可以通过将所有}{
或}\n{
替换为},{
来修改它,然后将[
放在开头,将]
放在最后。这应该可以将此特定文件转换为列表的有效JSON。转换为字典会涉及更多。
理想情况下,您可以自己控制文件格式,在这种情况下,只需更改生成文件的任何内容即可生成正确的JSON。
获得有效的JSON并将其解析为parsedData
变量后,您需要修复此行:
result = parsedData["_id"][location][0] as! String;
假设location
相当于JSON中的_id
字符串,那么您可以使用上面JSON的字典版本并用以下内容替换该行:
result = parsedData[location]["country"];
但是,如果location
不是JSON中的_id
字符串,那么您最好使用上面的JSON列表版本,并使用for
循环以比较每个列表项的值(或使用JSON的字典版本键入JSON中实际关联的location
)。