You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中如何将数组格式的字符串转换为原生数组类型

问题背景

持有的原始字符串内容:
"[\"0\", \"0\", \"1\", \"0\", \"0\", \"0\", \"0\"]"
期望转换得到的目标数组:
["1","1","1","1","1","1","1"]

已尝试的无效方案

方案1

直接对字符串调用map方法遍历,代码如下:

let test = "[\"0\", \"0\", \"1\", \"0\", \"0\", \"0\", \"0\"]"
let array = test.map( { String($0) })
debugPrint(array ?? []) // 无效

失效原因:String的map方法会逐字符遍历字符串内容,把每个字符单独转成字符串元素,根本不会识别JSON数组的结构边界,得到的结果是拆分到单个[、"、0这类字符的数组,和预期完全不符。

方案2

自定义转义字符替换逻辑,代码如下:

var unescaped: String {
    let entities = ["\0": "\\0",
                    "\t": "\\t",
                    "\n": "\\n",
                    "\r": "\\r",
                    "\"": "\\\"",
                    "\'": "\\'",
                    "": "\"",
    ]
    
    return entities
        .reduce(self) { (string, entity) in
            string.replacingOccurrences(of: entity.value, with: entity.key)
        }
        .replacingOccurrences(of: "\\\\(?!\\\\)", with: "", options: .regularExpression)
        .replacingOccurrences(of: "\\\\", with: "\\")
}

debugPrint("[\"0\", \"0\", \"1\", \"0\", \"0\", \"0\", \"0\"]".unescaped) // 无效

失效原因:

  1. 映射表中存在空字符串作为key的错误项,会导致替换逻辑异常
  2. 就算转义逻辑完全正确,最终得到的也只是去掉转义符的普通字符串,不会自动转换成[String]数组类型
  3. 手写转义规则覆盖不全,遇到特殊字符、嵌套结构很容易出问题
可行实现方案

你持有的字符串本质是标准格式的JSON数组序列化结果,不需要手写转义、拆分逻辑,直接调用系统原生JSON解析API即可,解析完成后按需求把所有元素替换为"1"就能得到目标结果。

方案1:使用JSONSerialization实现

import Foundation

let rawString = "[\"0\", \"0\", \"1\", \"0\", \"0\", \"0\", \"0\"]"
// 字符串转Data后解析为字符串数组
guard let jsonData = rawString.data(using: .utf8),
      let originArray = try? JSONSerialization.jsonObject(with: jsonData) as? [String] else {
    // 处理解析失败的异常场景
    print("JSON解析失败")
    exit(0)
}
// 生成和原数组长度一致、所有元素为"1"的目标数组
let targetArray = [String](repeating: "1", count: originArray.count)
debugPrint(targetArray) // 输出: ["1", "1", "1", "1", "1", "1", "1"]

方案2:使用Codable实现(Swift原生推荐写法)

import Foundation

let rawString = "[\"0\", \"0\", \"1\", \"0\", \"0\", \"0\", \"0\"]"
guard let jsonData = rawString.data(using: .utf8) else {
    print("字符串转Data失败")
    exit(0)
}
do {
    let originArray = try JSONDecoder().decode([String].self, from: jsonData)
    let targetArray = [String](repeating: "1", count: originArray.count)
    debugPrint(targetArray) // 输出: ["1", "1", "1", "1", "1", "1", "1"]
} catch {
    print("解析错误: \(error.localizedDescription)")
}

注意:处理JSON格式的字符串时,永远优先使用标准库提供的解析API,不要自己手写字符串拆分、转义替换逻辑,否则很容易漏掉边界case(比如元素内含逗号、引号、转义特殊字符的场景),导致代码稳定性极差。

内容的提问来源于stack exchange,提问作者Naresh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 05:09:31