首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何接收json字符串并将其转换为Dictionary?

如何接收json字符串并将其转换为Dictionary?
EN

Stack Overflow用户
提问于 2020-09-04 19:57:15
回答 3查看 67关注 0票数 3

下面粘贴了一个JSON

代码语言:javascript
复制
{
    "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

代码语言:javascript
复制
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

EN

回答 3

Stack Overflow用户

发布于 2020-09-04 22:03:46

您正在将数据检查为isValidJsonObject,这就是为什么它会给出无效的json。您应尝试将数据转换为jsonObject,然后选中isValidJsonObject

我尝试如下所示,它给出了有效的json

代码语言:javascript
复制
 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")
  }
票数 3
EN

Stack Overflow用户

发布于 2020-09-04 20:42:34

您需要对pattern属性中的2个escape字符进行转义,才能通过JSONSerialization的验证检查

代码语言:javascript
复制
{
  "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:)函数不会给你一个错误:

代码语言:javascript
复制
do {
    if let dict = try JSONSerialization.jsonObject(with: Data(jsonString.utf8)) as? [String: Any] {
        print(dict)
    }
} catch {
    print(error)
}

更新:更好的是,您可以使用Codable协议来创建模型结构:

代码语言:javascript
复制
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直接映射到该模型。

代码语言:javascript
复制
let decoder = JSONDecoder()

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

Stack Overflow用户

发布于 2020-09-04 22:29:38

你可以像这样做简单的swift。可以使用像https://app.quicktype.io/这样的Web App将JSON转换为快速结构:)

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63740740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档