1. ホーム

[解決済み】JSON文字列を辞書に変換する方法は?

2022-04-10 22:27:07

質問

Swiftのプロジェクトで、StringをDictionaryのjson形式に変換する関数を作りたいのですが、1つのエラーが発生しました。

式の型(@lvalue NSData,options: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;
}

解決方法は?

警告: これは、何らかの理由でJSON文字列から作業する必要がある場合に、JSON文字列を辞書に変換する便利な方法です。しかし、もしあなたがJSONの データ が利用可能な場合は、代わりに データで作業する 文字列を一切使用しない。

スイフト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)

スウィフト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)

Swift 1のオリジナル回答です。

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]? { ... }