json - 在 Swift 中调用 JSONSerialization 时获取无效的 json
问题描述
我正在尝试访问URL
并解析 JSON 输出。utf8
在编码代码中打印 JSON :
let urlString:String = "https://developer.nrel.gov/api/.../"
let pvURL = URL(string: urlString)
let dataTask = URLSession.shared.dataTask(with:pvURL!) { (data, response, error) in
do {
let json = try JSONSerialization.jsonObject(with: data!)
print(String(data: data!, encoding: .utf8)!)
}catch let err {
print("error: \(err.localizedDescription)")
}
}
dataTask.resume()
打印以下输出。我在在线 JSON 解析器中尝试了这个 JSON,但它失败了。在第一行本身给出错误。
{"inputs":{"lat":"29.93","lon":"-95.61","system_capacity":"30.30","azimuth":"180","tilt":"40","array_type":"1","module_type":"1","losses":"10"},"errors":[],"warnings":[],"version":"1.0.1","ssc_info":{"version":45,"build":"Linux 64 bit GNU/C++ Jul 7 2015 14:24:09"},"station_info":{"lat":29.93000030517578,"lon":-95.62000274658203,"elev":41.0,"tz":-6.0,"location":"None","city":"","state":"Texas","solar_resource_file":"W9562N2993.csv","distance":964},"outputs":{"ac_monthly":[3480.57373046875,3440.078369140625,3992.6513671875,3977.071533203125,4074.91357421875,3701.75,3897.655517578125,4248.00390625,4023.283447265625,4157.29931640625,3605.156005859375,3342.12890625],"poa_monthly":[139.791015625,140.18896484375,164.8218536376953,164.47149658203125,173.2971649169922,159.90576171875,169.84793090820312,186.20114135742188,173.14492797851562,176.2291717529297,148.28318786621094,136.62326049804688],"solrad_monthly":[4.509387493133545,5.006748676300049,5.316833972930908,5.4823832511901855,5.590230941772461,5.3301920890808105,5.4789652824401855,6.00648832321167,5.77149772644043,5.684812068939209,4.94277286529541,4.407201766967773],"dc_monthly":[3644.867919921875,3606.52001953125,4179.85107421875,4158.3193359375,4252.9140625,3865.03369140625,4069.092041015625,4432.62744140625,4198.369140625,4336.99609375,3767.055419921875,3490.091064453125],"ac_annual":45940.55859375,"solrad_annual":5.293959140777588,"capacity_factor":17.308107376098633}}`
而如果我urlString
在浏览器中访问会给出有效的 json:
{
"inputs": {
"lat": "29.93",
"lon": "-95.61",
"system_capacity": "30.30",
"azimuth": "180",
"tilt": "40",
"array_type": "1",
"module_type": "1",
"losses": "10"
},
"errors": [],
"warnings": [],
"version": "1.0.1",
"ssc_info": {
"version": 45,
"build": "Linux 64 bit GNU/C++ Jul 7 2015 14:24:09"
},
"station_info": {
"lat": 29.93000030517578,
"lon": -95.62000274658203,
"elev": 41,
"tz": -6,
"location": "None",
"city": "",
"state": "Texas",
"solar_resource_file": "W9562N2993.csv",
"distance": 964
},
"outputs": {
"ac_monthly": [
3480.57373046875,
3440.078369140625,
3992.6513671875,
3977.071533203125,
4074.91357421875,
3701.75,
3897.655517578125,
4248.00390625,
4023.283447265625,
4157.29931640625,
3605.156005859375,
3342.12890625
],
...
}
解决方案
在您的代码中,您将 JSON 数据转换为 JSON 对象(数组、字典)。
但在浏览器中,JSON 数据打印为字符串而不是 JSON 对象(数组、字典)。
因此,如果您还想在代码中打印 JSON 字符串,您可以像下面这样打印。
let string = String(data: self, encoding: .utf8)
print("JSON String:\(String(describing: string))")
希望能帮助到你。
推荐阅读
- charts - 谷歌时间线图使第一列可点击
- validation - 使用 OmniFaces o:validateMultiple 验证 ap:dataTable 或 p:treeTable 中的多个输入
- powershell - 如何将变量添加为结果集中的列值?
- reactjs - TypeError:无法读取未定义的属性“位置”(开玩笑)
- python - 如何折叠列并将值覆盖到单行中
- c++ - 如何将 2 个类分成单独的 .h 文件并正确设置它们
- c++ - 在 C++ 中查询 MySQL 数据库不返回所有值
- gradle - 如何运行 ktor 应用程序?
- android - AOSP 中的旧提交来自哪里?
- html - 使用对象时如何在鼠标悬停时更改 SVG 笔触颜色