Swift 4 将字符串解析为 json 对象

Posted

技术标签:

【中文标题】Swift 4 将字符串解析为 json 对象【英文标题】:Swift 4 parse string to json object 【发布时间】: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 【参考方案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)
    

【讨论】:

感谢您的回复,是的,如果我使用了两个“,那么您是对的,那么它可以正常工作,但不幸的是我有“关注”。结果它没有用。无论如何我找到了解决方案。如果它以“'”开头,我已经检查了字符串的第一个和最后一个字符,然后将其删除然后解析。

以上是关于Swift 4 将字符串解析为 json 对象的主要内容,如果未能解决你的问题,请参考以下文章

Swift 4 Codable:将 JSON 返回字符串转换为 Int/Date/Float

JSON .count 数组在 Swift 4 中总是返回 0

如何将 alamofire 返回 json 解析为 Swift 中的字符串数组?

Swift 4 解析 1+n 数量的 json 数字键

为啥 Alamofire 4.4.0 将 JSON 字符串转换为转义的 JSON 字符串(Swift 3)?

将 swift 对象转换为 JSON 字符串