json - Swift 3 解析 json 文件中的值

标签 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 值或相关的国家/地区代码以字符串形式返回。

我收到错误:

"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/

相关文章:

ios - 将 TableViewController 中的 TableView 嵌入到另一个 View 中

java - 使用 JSON Java 检索嵌套数组值

javascript - JSON 与 Angular JS 不起作用(Ionic 和 Cordova)

xcode - rangeOfString 每次都不返回 nil

ios - 如何向部分和分页部分添加两个新单元格?

ios - 将数据传递给另一个方法

ios - 异步请求期间显示的加载事件指示器

javascript - 处理 JSON 中的 html 代码

android - 改造和 Moshi : Parsing a JSON Object with Two Arrays

javascript - Backbone 从嵌套 json 获取数据