【问题标题】:Swift 4 parse string to json objectSwift 4 将字符串解析为 json 对象
【发布时间】:2018-05-28 09:07:44
【问题描述】:

我已经实现了二维码扫描器,在“metadataOutput”委托方法中,我收到了具有“stringValue”之类键的响应,该键的值是

stringValue "'{ "part_number":"154100102232", "lot_number":"03S32401701344"}'"

我想将字符串值解析为 json 对象,但我做不到。

let data = stringValue.data(using: .utf8)!
            do {
                if let json = try JSONSerialization.jsonObject(with: data, options : .allowFragments) as? [AnyHashable:Any]
                {

                    print("Json:::",json)
                    // post a notification
                   // NotificationCenter.default.post(name: NSNotification.Name(rawValue: "SCANNER_DATA"), object: nil, userInfo: json)

                } else {
                    print("bad json")
                }
            } catch let error as NSError {
                print(error)
            }

我已经按照上面的方法将字符串解析为json,但是我发现了以下错误。

Error Domain=NSCocoaErrorDomain Code=3840 "周围的值无效 字符 0。” UserInfo={NSDebugDescription=无效值 字符 0.}

有人对此有任何想法吗?

【问题讨论】:

  • 您的字符串中似乎有一些无效字符。请后端开发人员以有效格式提供并使用jsonObject(with: data, options: [])。
  • 询问你的后端服务是否给你jsonString

标签: ios json swift parsing qr-code


【解决方案1】:

最好有这样的字符串扩展

 extension String{
    func toDictionary() -> NSDictionary {
        let blankDict : NSDictionary = [:]
        if let data = self.data(using: .utf8) {
            do {
                return try JSONSerialization.jsonObject(with: data, options: []) as! NSDictionary
            } catch {
                print(error.localizedDescription)
            }
        }
        return blankDict
    }
}

这样使用

let dict = stringValue.toDcitionary()

或者您可以使用 pod 来完成来自 github https://github.com/utills/UtilityKit 上的 UtilityKit 的所有这些类型的工作

【讨论】:

  • 很好的解决方案。
  • 强烈建议您不要使用建议 Foundation 类型 NSArray/NSDictionary 而不是 Swift 本机类型的库。您正在与强类型系统作斗争。
【解决方案2】:

这对我有用,你的字符串在尾随 "' 内容 '" 周围有 ' 字符

   let  stringValue = """
{"part_number":"154100102232","lot_number":"03S32401701344"}
"""

    let data = stringValue.data(using: .utf8)!
    do {
        if let json = try JSONSerialization.jsonObject(with: data) as? [String:Any]
        {
             print("ewtyewytyetwytewytewtewytew",json)

        } else {
            print("ewtyewytyetwytewytewtewytew","bad json")
        }
    } catch let error as NSError {
        print("ewtyewytyetwytewytewtewytew",error)
    }

【讨论】:

  • 感谢您的回复,是的,如果我使用了两个“,那么您是对的,那么它可以正常工作,但不幸的是我有“关注”。结果它没有用。无论如何我找到了解决方案。如果它以“'”开头,我已经检查了字符串的第一个和最后一个字符,然后将其删除然后解析。
猜你喜欢
  • 1970-01-01
  • 2013-03-12
  • 1970-01-01
  • 2019-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多