如何接收一个 JSON 字符串并将其转换为字典?

3

我下方贴了一个JSON

{
    "name" :
    {
        "id" : "name",
        "label" : "name field",
        "disabled" : false,
        "display" : true,
        "pattern" : "^\\+(?:[0-9] ?){6,14}[0-9]$",
        "type" : "text"
    },
     "age" :
   {
    "id" : "age",
    "label" : "age",
    "disabled" : false,
    "display" : true,
    "pattern" : "^\\+(?:[0-9] ?){6,14}[0-9]$",
    "type" : "text"
   }
}

我需要将这个JSON字符串传递到我的方法中,并将其转换为字典类型的嵌套字典 Dictionary<String,Dictionary<String,Any>>

首先,我尝试在传递给方法之前验证JSON字符串,但总是提示无效的json。

let jsonData = json.data(using: String.Encoding.utf8)

   if JSONSerialization.isValidJSONObject(jsonData) {
       print("Valid Json")
   } else {
       print("InValid Json")
   }

您知道为什么这个JSON字符串总是返回无效的JSON吗?

我在Playground里尝试过,请查看截图输入图片描述


https://developer.apple.com/documentation/foundation/jsondecoder - user28434'mstep
什么是“动态嵌套”? - user28434'mstep
像姓名、年龄这样的键可能会有无数个。 - KNP
你能检查一下我的新截图吗?我已经尝试过了,但是没有希望。 - KNP
完整的错误信息是什么?仅有“本地化描述”是不足以进行调试的。 - user28434'mstep
显示剩余3条评论
3个回答

3
您正在使用isValidJsonObject检查数据,这就是为什么它会给出无效的json格式。 您应该尝试将数据转换为json对象,然后再检查isValidJsonObject。
我尝试了以下方式,它给出了有效的json格式。
 let jsonData = try! JSONSerialization.data(withJSONObject: json, options: [])

 let jsonObject = try!JSONSerialization.jsonObject(with: jsonData, options: [])

 if JSONSerialization.isValidJSONObject(test) {
               print("Valid Json")
  } else {
               print("InValid Json")
  }

2

如果您想通过JSONSerialization的验证检查,需要在pattern属性中转义2个escape字符:

{
  "name": {
    "id": "name",
    "label": "name field",
    "disabled": false,
    "display": true,
    "pattern": "^\\\\+(?:[0-9] ?){6,14}[0-9]$",
    "type": "text"
  },
  "age": {
    "id": "age",
    "label": "age",
    "disabled": false,
    "display": true,
    "pattern": "^\\\\+(?:[0-9] ?){6,14}[0-9]$",
    "type": "text"
  }
}

那么使用JSONSerializationjsonObject(with:options:)函数将不会给你一个错误:

do {
    if let dict = try JSONSerialization.jsonObject(with: Data(jsonString.utf8)) as? [String: Any] {
        print(dict)
    }
} catch {
    print(error)
}

更新: 更好的方法是使用Codable协议创建模型结构:

struct Response: Codable {
    var name: Name
    var age: Age
}

struct Name: Codable {
    var id: String
    var label: String
    var disabled: Bool
    var display: Bool
    var pattern: String
    var type: String
}

struct Age: Codable {
    var id: String
    var label: String
    var disabled: Bool
    var display: Bool
    var pattern: String
    var type: String
}

使用JSONDecoder直接将您的JSON映射到该模型:

let decoder = JSONDecoder()

do {
    let decoded = try decoder.decode(Response.self, from: Data(jsonString.utf8))
    print(decoded)
} catch {
    print(error)
}

1
你可以像这样简单地使用Swift。你可以使用Web应用程序https://app.quicktype.io/将JSON转换为Swift结构体 :)
import Foundation

// MARK: - NameAge
struct NameAge: Codable {
    let name, age: Age
}

// MARK: - Age
struct Age: Codable {
    let id, label: String
    let disabled, display: Bool
    let pattern, type: String
}

let JSON = """
{
    "name" :
    {
        "id" : "name",
        "label" : "name field",
        "disabled" : false,
        "display" : true,
        "pattern" : "^\\+(?:[0-9] ?){6,14}[0-9]$",
        "type" : "text"
    },
     "age" :
   {
    "id" : "age",
    "label" : "age",
    "disabled" : false,
    "display" : true,
    "pattern" : "^\\+(?:[0-9] ?){6,14}[0-9]$",
    "type" : "text"
   }
}
"""
let jsonData = JSON.data(using: .utf8)!
let nameAge = try? newJSONDecoder().decode(NameAge.self, from: jsonData)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接