能否跳过JSON对象表中始终返回nil的首个属性?
解决首个属性返回nil的问题:跳过它就行!
没问题,要跳过那个总是返回nil的首个属性其实很简单,咱们直接从属性数组的第二个元素开始处理就好。先看看怎么调整你的代码,顺便也给你提个更稳妥的JSON生成方案~
一、修改现有代码:跳过首个属性
你原来的代码是遍历整个properties数组,现在只需要跳过第一个元素。在Swift里可以用dropFirst()方法直接跳过数组的第一个元素,修改后的关键部分如下:
// 原来的遍历:for property in properties // 修改后:跳过第一个属性 for property in properties.dropFirst() { let filteredTable = table.value(forKey: property) as! [Any] insideStr += "\"\(property)\": \"\(filteredTable[i - 2])\"," }
这样就完全不会处理那个返回nil的首个属性了。另外提个小问题:你手动拼接JSON的时候要注意逗号的处理,最后一个键值对后面的逗号容易导致JSON格式错误,你原来的代码里虽然做了截断,但其实可以用更灵活的方式,比如先把每个键值对存到数组里,再用joined(separator: ",")拼接,这样就不用手动处理逗号了:
// 替换原来的insideStr拼接逻辑 var keyValuePairs = [String]() for property in properties.dropFirst() { let filteredTable = table.value(forKey: property) as! [Any] // 注意:如果filteredTable[i-2]包含双引号,手动拼接会出问题,后面会说更安全的方法 keyValuePairs.append("\"\(property)\": \"\(filteredTable[i - 2])\"") } let insideStr = keyValuePairs.joined(separator: ",")
二、更稳妥的方案:用系统API生成JSON
手动拼接JSON很容易出错(比如字符串里有特殊字符、类型转换问题),Swift自带的JSONSerialization会更可靠。给你写个用JSONSerialization的版本,同样跳过首个属性:
func convertToJSON(table: NSArray, properties: [String]) throws -> String { var jsonArray = [[String: Any]]() for i in 0..<table.count { var itemDict = [String: Any]() // 跳过首个属性,从第二个开始 for property in properties.dropFirst() { guard let value = table[i].value(forKey: property) else { // 如果某个属性值为nil,可以选择跳过或者设为NSNull continue } itemDict[property] = value } jsonArray.append(itemDict) } let jsonData = try JSONSerialization.data(withJSONObject: jsonArray) guard let jsonString = String(data: jsonData, encoding: .utf8) else { throw NSError(domain: "JSONError", code: 0, userInfo: [NSLocalizedDescriptionKey: "Failed to convert data to string"]) } return jsonString }
这个方法会自动处理JSON格式的所有细节,比如特殊字符转义、逗号分隔,而且类型转换更安全,不容易出现格式错误。
最后再提醒一下
你原来的代码里filteredTable[i - 2]看起来有点奇怪,要确保索引不会越界哦——比如当i=0的时候,i-2会是-2,这会直接崩溃的,一定要注意数组索引的合法性~
内容的提问来源于stack exchange,提问作者moliere1226
相关产品推荐
相关产品推荐

