首页 文章

如何将JSON字符串转换为字典?

提问于
浏览
118

我想在我的swift项目中创建一个函数,将String转换为Dictionary json格式但是我遇到一个错误:

无法转换表达式的类型(@lvalue NSData,选项:IntegerLitralConvertible ...

这是我的代码:

func convertStringToDictionary (text:String) -> Dictionary<String,String> {

    var data :NSData = text.dataUsingEncoding(NSUTF8StringEncoding)!
    var json :Dictionary = NSJSONSerialization.JSONObjectWithData(data, options:0, error: nil)
    return json
}

我在Objective-C中创建了这个函数:

- (NSDictionary*)convertStringToDictionary:(NSString*)string {
  NSError* error;
  //giving error as it takes dic, array,etc only. not custom object.
  NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
  id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
  return json;
}

6 回答

  • 11

    警告:如果由于某种原因必须使用JSON字符串,则这是将JSON字符串转换为字典的便捷方法 . 但是如果你有JSON data 可用,你应该改为work with the data,而根本不使用字符串 .

    Swift 3

    func convertToDictionary(text: String) -> [String: Any]? {
        if let data = text.data(using: .utf8) {
            do {
                return try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
            } catch {
                print(error.localizedDescription)
            }
        }
        return nil
    }
    
    let str = "{\"name\":\"James\"}"
    
    let dict = convertToDictionary(text: str)
    

    Swift 2

    func convertStringToDictionary(text: String) -> [String:AnyObject]? {
        if let data = text.dataUsingEncoding(NSUTF8StringEncoding) {
            do {
                return try NSJSONSerialization.JSONObjectWithData(data, options: []) as? [String:AnyObject]
            } catch let error as NSError {
                print(error)
            }
        }
        return nil
    }
    
    let str = "{\"name\":\"James\"}"
    
    let result = convertStringToDictionary(str)
    

    Original Swift 1 answer:

    func convertStringToDictionary(text: String) -> [String:String]? {
        if let data = text.dataUsingEncoding(NSUTF8StringEncoding) {
            var error: NSError?
            let json = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.allZeros, error: &error) as? [String:String]
            if error != nil {
                println(error)
            }
            return json
        }
        return nil
    }
    
    let str = "{\"name\":\"James\"}"
    
    let result = convertStringToDictionary(str) // ["name": "James"]
    
    if let name = result?["name"] { // The `?` is here because our `convertStringToDictionary` function returns an Optional
        println(name) // "James"
    }
    

    在您的版本中,您没有将适当的参数传递给 NSJSONSerialization 并忘记转换结果 . 此外,最好检查可能的错误 . 最后一点:仅当您的值为String时,此方法才有效 . 如果它可能是另一种类型,最好像这样声明字典转换:

    let json = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.allZeros, error: &error) as? [String:AnyObject]
    

    当然,您还需要更改函数的返回类型:

    func convertStringToDictionary(text: String) -> [String:AnyObject]? { ... }
    
  • 303

    我是've updated Eric D'的回答 Swift 2

    func convertStringToDictionary(text: String) -> [String:AnyObject]? {
        if let data = text.dataUsingEncoding(NSUTF8StringEncoding) {
            do {
                let json = try NSJSONSerialization.JSONObjectWithData(data, options: .MutableContainers) as? [String:AnyObject]
                return json
            } catch {
                print("Something went wrong")
            }
        }
        return nil
    }
    
  • 1

    Swift 3

    if let data = text.data(using: String.Encoding.utf8) {
        do {
            let json = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [String:Any]
            print(json)
        } catch {
            print("Something went wrong")
        }
    }
    
  • 50

    使用Swift 3, JSONSerialization 有一个名为jsonObject(with:options:)的方法 . jsonObject(with:options:) 有以下声明:

    class func jsonObject(with data: Data, options opt: JSONSerialization.ReadingOptions = []) throws -> Any
    

    从给定的JSON数据返回Foundation对象 .

    当您使用 jsonObject(with:options:) 时,您必须处理错误处理( trytry?try! )并键入强制转换(来自 Any ) . 因此,您可以使用以下模式之一解决问题 .


    #1 . 使用抛出并返回非可选类型的方法

    import Foundation
    
    func convertToDictionary(from text: String) throws -> [String: String] {
        guard let data = text.data(using: .utf8) else { return [:] }
        let anyResult: Any = try JSONSerialization.jsonObject(with: data, options: [])
        return anyResult as? [String: String] ?? [:]
    }
    

    用法:

    let string1 = "{\"City\":\"Paris\"}"
    do {
        let dictionary = try convertToDictionary(from: string1)
        print(dictionary) // prints: ["City": "Paris"]
    } catch {
        print(error)
    }
    
    let string2 = "{\"Quantity\":100}"
    do {
        let dictionary = try convertToDictionary(from: string2)
        print(dictionary) // prints [:]
    } catch {
        print(error)
    }
    
    let string3 = "{\"Object\"}"
    do {
        let dictionary = try convertToDictionary(from: string3)
        print(dictionary)
    } catch {
        print(error) // prints: Error Domain=NSCocoaErrorDomain Code=3840 "No value for key in object around character 9." UserInfo={NSDebugDescription=No value for key in object around character 9.}
    }
    

    #2 . 使用抛出并返回可选类型的方法

    import Foundation
    
    func convertToDictionary(from text: String) throws -> [String: String]? {
        guard let data = text.data(using: .utf8) else { return [:] }
        let anyResult: Any = try JSONSerialization.jsonObject(with: data, options: [])
        return anyResult as? [String: String]
    }
    

    用法:

    let string1 = "{\"City\":\"Paris\"}"
    do {
        let dictionary = try convertToDictionary(from: string1)
        print(String(describing: dictionary)) // prints: Optional(["City": "Paris"])
    } catch {
        print(error)
    }
    
    let string2 = "{\"Quantity\":100}"
    do {
        let dictionary = try convertToDictionary(from: string2)
        print(String(describing: dictionary)) // prints nil
    } catch {
        print(error)
    }
    
    let string3 = "{\"Object\"}"
    do {
        let dictionary = try convertToDictionary(from: string3)
        print(String(describing: dictionary))
    } catch {
        print(error) // prints: Error Domain=NSCocoaErrorDomain Code=3840 "No value for key in object around character 9." UserInfo={NSDebugDescription=No value for key in object around character 9.}
    }
    

    #3 . 使用不抛出并返回非可选类型的方法

    import Foundation
    
    func convertToDictionary(from text: String) -> [String: String] {
        guard let data = text.data(using: .utf8) else { return [:] }
        let anyResult: Any? = try? JSONSerialization.jsonObject(with: data, options: [])
        return anyResult as? [String: String] ?? [:]
    }
    

    用法:

    let string1 = "{\"City\":\"Paris\"}"
    let dictionary1 = convertToDictionary(from: string1)
    print(dictionary1) // prints: ["City": "Paris"]
    
    let string2 = "{\"Quantity\":100}"
    let dictionary2 = convertToDictionary(from: string2)
    print(dictionary2) // prints: [:]
    
    let string3 = "{\"Object\"}"
    let dictionary3 = convertToDictionary(from: string3)
    print(dictionary3) // prints: [:]
    

    #4 . 使用不抛出并返回可选类型的方法

    import Foundation
    
    func convertToDictionary(from text: String) -> [String: String]? {
        guard let data = text.data(using: .utf8) else { return nil }
        let anyResult = try? JSONSerialization.jsonObject(with: data, options: [])
        return anyResult as? [String: String]
    }
    

    用法:

    let string1 = "{\"City\":\"Paris\"}"
    let dictionary1 = convertToDictionary(from: string1)
    print(String(describing: dictionary1)) // prints: Optional(["City": "Paris"])
    
    let string2 = "{\"Quantity\":100}"
    let dictionary2 = convertToDictionary(from: string2)
    print(String(describing: dictionary2)) // prints: nil
    
    let string3 = "{\"Object\"}"
    let dictionary3 = convertToDictionary(from: string3)
    print(String(describing: dictionary3)) // prints: nil
    
  • 0

    斯威夫特4

    extension String {
        func convertToDictionary() -> [String: Any]? {
            if let data = self.data(using: .utf8) {
                do {
                    return try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
                } catch {
                    print(error.localizedDescription)
                }
            }
            return nil
        }
    }
    
  • 22

    我找到了一个代码,将json字符串转换为NSDictionary或NSArray.just添加扩展名 SWIFT 3.0

    HOW TO USE

    let jsonData = (convertedJsonString as! String).parseJSONString
    

    EXTENSTION

    extension String
    {
    var parseJSONString: AnyObject?
    {
        let data = self.data(using: String.Encoding.utf8, allowLossyConversion: false)
        if let jsonData = data
        {
            // Will return an object or nil if JSON decoding fails
            do
            {
                let message = try JSONSerialization.jsonObject(with: jsonData, options:.mutableContainers)
                if let jsonResult = message as? NSMutableArray {
                    return jsonResult //Will return the json array output
                } else if let jsonResult = message as? NSMutableDictionary {
                    return jsonResult //Will return the json dictionary output
                } else {
                    return nil
                }
            }
            catch let error as NSError
            {
                print("An error occurred: \(error)")
                return nil
            }
        }
        else
        {
            // Lossless conversion of the string was not possible
            return nil
        }
    }
    

    }

相关问题