下面粘贴了一个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类型的字典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吗?
我已经在操场上试过了,请查看截图enter image description here
发布于 2020-09-04 22:03:46
您正在将数据检查为isValidJsonObject,这就是为什么它会给出无效的json。您应尝试将数据转换为jsonObject,然后选中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")
}发布于 2020-09-04 20:42:34
您需要对pattern属性中的2个escape字符进行转义,才能通过JSONSerialization的验证检查
{
"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"
}
}那么使用JSONSerialization的jsonObject(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)
}发布于 2020-09-04 22:29:38
你可以像这样做简单的swift。可以使用像https://app.quicktype.io/这样的Web App将JSON转换为快速结构:)
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)https://stackoverflow.com/questions/63740740
复制相似问题