gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:46:38 27 4
gpt4 key购买 nike

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com