【问题标题】:Swift using String to create JSON objectSwift 使用 String 创建 JSON 对象
【发布时间】:2023-04-03 09:08:01
【问题描述】:

我正在尝试使用 swift 从数据库中获取的字符串作为 JSON。我尝试将字符串转换为数据对象,然后使用 JSONSerialization,但结果总是返回 nil。

这是我的代码示例:

var string = "{Param1: \"Value\", Param2: \"value2\", Param3: \"value3\"}"
let data = (reducedOptionsString as NSString).dataUsingEncoding(NSUTF8StringEncoding)
if let d = data{
    var err : NSErrorPointer = nil
    let parsedObject: AnyObject? = NSJSONSerialization.JSONObjectWithData(d, options: NSJSONReadingOptions.MutableLeaves, error: err)
    if let dict = parsedObject as? Dictionary<String, AnyObject>{
          ...
    }
}

由于某种原因,parsedObject 总是返回为 nil

有谁知道我在将字符串数据转换为我可以使用的 JSON 对象时可能缺少什么?

【问题讨论】:

  • 为什么忽略error参数?失败时打印出来。
  • 代码不正确,string 未使用,reducedOptionsString 未定义。我猜他们是一样的。

标签: ios json swift


【解决方案1】:

您的 json 无效,密钥也必须用引号括起来。

"{ \"Param1\": \"Value\", \"Param2\": \"value2\", \"Param3\": \"value3\"}"

另外,正如@zaph 所指出的,它是变量string 您要转换为数据的变量。

var string = "{\"Param1\": \"Value\", \"Param2\": \"value2\", \"Param3\": \"value3\"}"
if let data = string.dataUsingEncoding(NSUTF8StringEncoding){
    var err : NSErrorPointer = nil
    let parsedObject = NSJSONSerialization.JSONObjectWithData(
        data!,
        options: NSJSONReadingOptions.MutableLeaves, 
        error: err) as? Dictionary<String, AnyObject>

    if (parsedObject != nil) {
        ...
    }
    else {
        if (err != nil) {
            println("Error: \(err)")
        }
        else {
            println("Error: unexpected error parsing json string")
        }
    }
}

或者,您可以使用SwiftyJSON,这是一个非常流行的库,可以在 swift 上处理 json,这可以让您的生活更轻松一些。

【讨论】:

    【解决方案2】:
        var string = "{\"Param1\": \"Value\", \"Param2\": \"value2\", \"Param3\": \"value3\"}"
    
        if let data = (string as NSString).dataUsingEncoding(NSUTF8StringEncoding)
        {
            var err : NSErrorPointer = nil
            let parsedObject: AnyObject? = NSJSONSerialization.JSONObjectWithData(data, options:    NSJSONReadingOptions.MutableLeaves, error: err)
    
            if (err != nil)
            {
                println("error handling...")
            }
    
            if let dict = parsedObject as? Dictionary<String, AnyObject>
            {
                println("XD")
            }
        }
    

    【讨论】:

    • 呵呵呵呵 :),只是一个笑脸,因为我不能忍受代码中的空 if 语句和写“...”会迫使你在复制到项目时替换这一行,即使你只是想测试它是否编译......所以,它让生活更轻松,只是一点点;)
    【解决方案3】:

    您只需在 OWN 代码中替换以下 2 行,其余的就可以了。 :)

    var string = "{\"Param1\": \"Value\", \"Param2\": \"value2\", \"Param3\": \"value3\"}"
    let data = (string as NSString).dataUsingEncoding(NSUTF8StringEncoding)
    

    【讨论】:

      【解决方案4】:

      Swift 5 示例:

      let properties: [(String, Any?)] = [("firstName", firstName),
                                              ("lastName", lastName),
                                              ("city", city),
                                              ("state", state),
                                              ("zipCode", zipCode),
                                              ("country", country)]
      
      let body = properties.compactMap({ property -> (String, Any)? in
              if let value = property.1 {
                  return (property.0, value)
              } else {
                  return nil
              }
          })
      
      let jsonDict = Dictionary(uniqueKeysWithValues: body)
      let jsonData = try? JSONSerialization.data(withJSONObject: jsonDict, options: [])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-06-06
        • 2020-10-23
        • 2019-10-28
        • 2015-03-27
        • 1970-01-01
        • 2019-07-17
        • 2013-01-29
        • 2016-10-27
        相关资源
        最近更新 更多