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 值或相关的国家/地区代码以字符串形式返回。
我收到错误:
"Type 'Any?' has no subscript members",
我写的方法:
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;
}
最佳答案
这不是有效的 JSON。我认为最接近的有效 JSON 等价物将是 EITHER 一个 JSON list ,例如:
[
{"_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}}
}
即,一个用大括号括起来的字典,在 :
和值(a :
之后的所有其他项目的字典。
(换行符、制表符、空格将被忽略,我只是将它们包含在内以使我所做的事情显而易见)。
我认为字典版本可能更适合您的代码,但这取决于您还想对数据做什么。列表可能更适合某些情况。
我编写了一个快速的 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
为键)。
关于json - Swift 3 解析 json 文件中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41558752/