【问题标题】:How to serialize JSON string to multidimensional NSDictionary如何将 JSON 字符串序列化为多维 NSDictionary
【发布时间】:2020-07-17 12:10:40
【问题描述】:
"[{\"person\":\"person1\",\"data\":{\"age\":\"10\",\"name\":\"John\"}},
{\"person\":\"person2\",\"data\":{\"age\":\"20\",\"name\":\"Jonathan\"}},
{\"person\":\"person3\",\"data\":{\"age\":\"30\",\"name\":\"Joe\"}}]"

注意“data”的值也是一个字典。

我有一个像上面这样的 JSON 字符串,我正在尝试像这样序列化:

if let dataFromString = conf.data(using: .utf8, allowLossyConversion: false) {
        let json = try JSON(data: dataFromString)
        
        configuration = json.dictionary ?? [:]
    }

但是配置总是一个空字典。

【问题讨论】:

  • [ ] 表示根 json 数组,而不是字典。 .dictionary 可能不正确,可能有一个 .array,具体取决于您使用的 JSON 库。
  • 是的,但它始终是一个单元素数组。

标签: json swift nsdictionary


【解决方案1】:

您需要将JSON 解析为arraydictionaries 类型[[String: Any]]。更好的现代方法是使用Decodable 模型来解码JSON

let string = """
[
    {
        "person": "person1",
        "data": {
            "age": "10",
            "name": "John"
        }
    },
    {
        "person": "person2",
        "data": {
            "age": "20",
            "name": "Jonathan"
        }
    },
    {
        "person": "person3",
        "data": {
            "age": "30",
            "name": "Joe"
        }
    }
]
"""

let data = Data(string.utf8)

struct Person: Decodable {
    let person: String
    let data: PersonData
}

struct PersonData: Decodable {
    let age, name: String
}

do {
    let people = try JSONDecoder().decode([Person].self, from: data)
    print(people)
} catch { print(error) }

【讨论】:

    【解决方案2】:

    对于 JSON String,

    let conf = "[{\"person\":\"person1\",\"data\":{\"age\":\"10\",\"name\":\"John\"}},{\"person\":\"person2\",\"data\":{\"age\":\"20\",\"name\":\"Jonathan\"}},{\"person\":\"person3\",\"data\":{\"age\":\"30\",\"name\":\"Joe\"}}]"
    

    使用JSONSerialization's jsonObject(with:options:) 方法获得预期的响应。

    if let conf = str.data(using: .utf8 ) {
        do {
            let dict = try JSONSerialization.jsonObject(with: data, options: []) as? [[String:Any]]
            print(dict)
        } catch {
            print(error)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-26
      • 1970-01-01
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多