【问题标题】:Replace instances of \" with "将 \" 的实例替换为 "
【发布时间】: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


【解决方案1】:

您的字符串是JSON 数组,因此只需将其转换为Array,无需用它替换任何内容。所以首先从jsonString 获取Data,然后使用dataJSONSerialization 从中获取Array

if let jsonData = try? Data(contentsOf: URL(fileURLWithPath: path))
    if let array = (try? JSONSerialization.jsonObject(with: jsonData, options: [])) as? [[String: Any]] {
        print(array.first?["a"])
    }
}

【讨论】:

  • 当完全按照自己的方式尝试而不是使用 JSONSerializer 库时,我仍然会进入 if let dic = 的 else
  • 什么是JSONSerializer.toDictionaryjsonStr 包含"{\"a\":1,\"b\":10000,\"c\":0,\"d\":\"\"}",对吧?
  • jsonStr 是发布在我的 q 中的整个 json,而不仅仅是数据键... JSONSerializer 可在此处获得:github.com/peheje/JsonSerializerSwift。我需要能够访问 json 中的所有键,而不仅仅是数据键中的键
  • @user2363025 因为data 键包含jsonString,所以您需要获取该字符串,然后将其转换为数据,然后将数据转换为字典[String:Any]
  • @user2363025 将该行更改为let dataJsonStr = i["data"] as! String
猜你喜欢
  • 2016-07-22
  • 2021-01-02
  • 1970-01-01
  • 2020-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多