【发布时间】:2017-01-12 10:59:54
【问题描述】:
我正在尝试从 json 文件中去除不需要的斜杠。我不能简单地替换 \ 的所有实例,而是我需要只用 "
来转义 \" 的实例例如我的 json 字符串如下所示:
[{
"type": "test",
"action": "test",
"filename": 1,
"data": "{\"a\":1,\"b\":10000,\"c\":0,\"d\":\"\"}"
}, {
"type": "test2",
"action": "test2",
"filename": 2,
"data": "{\"a\":2,\"b\":10000,\"c\":15,\"d\":\"\"}"
}]
我无法弄清楚查找和替换的语法:
let jsonStringTrimmed = jsonString.replacingOccurrences(of: "\"", with: """)
另一个可能的陷阱是参数 d 是一个 base64 编码的字符串,所以我需要能够避免在该键的值中替换 \"
目标是能够使用 jsonStringTrimmed 如下:
let jsonStr = try String(contentsOf: path, encoding: String.Encoding.utf8)
let jsonStringTrimmed = jsonStr.replacingOccurrences(of: "\", with: """)
let json = try JSONSerializer.toDictionary(jsonStringTrimmed)
更新:
我最初尝试过:
do {
let jsonStr = try String(contentsOf: path, encoding: String.Encoding.utf8)
let json = try JSONSerializer.toDictionary(jsonStr)
}
catch {
print("Error reading file : \(error)")
}
我陷入困境并收到错误 jsonIsNotDictinary
更新 2:在使用 NivraD 的方法后尝试遍历数组:
if let jsonData = try? Data(contentsOf: path){
if let array = (try? JSONSerialization.jsonObject(with: jsonData, options: [])) as? [[String: Any]] {
for i in array{
print(array[i]?["data"] as! String)
let dataJsonStr = array[i]?["data"] as! String
if let dataDict = try? JSONSerializer.toDictionary(dataJsonStr){
print("a : \(dataDict["a"] as! String)")
}
}
}
else{
print("in the else of if let array")
}
}
else{
print("in the else of if let jsonData")
}
但这给了我错误: 无法使用 Dictionary 类型的索引为 [[String : Any]] 类型的值下标指向: print(employeeArray[i]?["data"] as!String)
【问题讨论】:
-
你想要 a、b、c 和 d 的值对吗?
-
@NiravD 我需要替换 \'s 以便我可以将字符串转换为 json 对象以便使用 JSONSerializer 进行处理
-
尝试使用
.replacingOccurrences(of: "\\\"", with: "\""),因为字符串中的``用于转义下一个字符 -
@milo526 作为答案发布?这不是一个 Swift 问题,而是一个关于正则表达式的问题......
-
提示:不应该永远手动弄乱 JSON 字符串。它只是从不需要。如果您发现自己需要这样做,这实际上意味着您有另一个不同的问题。相反,请始终使用 Nirav 回答中的正确序列化/反序列化方法,您会没事的。
标签: json swift string replace escaping