Swift 3解析json文件中的值

时间:2017-01-09 23:31:58

标签: json swift

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;
}

1 个答案:

答案 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)。