web-dev-qa-db-ja.com

JSONSerialization JSON書き込みの無効なタイプ(_SwiftValue)

次のコードでエラーが発生するのはなぜですか:

JSON書き込み(_SwiftValue)のタイプが無効です。

次の行でエラーがスローされます。

urlRequest.httpBody = try JSONSerialization.data(withJSONObject: parameters)

完全なコード:

let parameters:Parameters = ["resource":[
        [
            "appUserCode":uuidString,
            "productNFCode": self.nfCode!,
            "status":code,
            "applicationKey":appDelegate.api_key
        ]
        ]
    ]
    do {

        urlRequest.httpBody = try JSONSerialization.data(withJSONObject: parameters)
    } catch {
        // No-op
    }
37
jimijon

ここに記載されている回答で問題が解決しない場合。 parameters内のオブジェクトの1つは、NSStringNSNumberNSArrayNSDictionary、またはNSNullのインスタンスではない可能性があると思います。 JSONSerializationクラスのドキュメントに記載されているとおり:

JSONに変換できるオブジェクトには、次のプロパティが必要です。

  1. 最上位のオブジェクトはNSArrayまたはNSDictionaryです。すべてのオブジェクトは、NSString、NSNumber、NSArray、NSDictionary、またはNSNullのインスタンスです。

  2. すべての辞書キーはNSStringのインスタンスです。数値はNaNまたは無限ではありません。

  3. 他の規則が適用される場合があります。 isValidJSONObject(_ :)を呼び出すか、変換を試みることが、特定のオブジェクトをJSONデータに変換できるかどうかを判断する決定的な方法です。

したがって、parametersオブジェクト内のオブジェクトのいずれかが上記の制約を満たさないかどうかを確認してください。

34
KrishnaCA

この問題が発生したのは、文字列の1つがオプションであったためです。次のような値をシリアル化しようとしました: "Optional(\" string value\")"

「文字列値」の代わりに

45
ddiego

誰かがまだ問題を抱えていてEnumsを使用している場合に備えて、rawValueではなくEnum値を渡している場合に別の原因が考えられます。

例:

enum Status: String {
  case open
  case closed
}

enumを渡す代わりに

params = ["status": Status.open]

パス

params = ["status": Status.open.rawValue]
11
gmogames

最初にNSObjectNSDictionaryに変換する必要があります

これを試してNSDictionaryに変換してください。

#import <objc/runtime.h>

//Add this utility method in your class.
+ (NSDictionary *)dictionaryWithPropertiesOfObject:(id)obj {
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];

    unsigned count;
    objc_property_t *properties = class_copyPropertyList([obj class], &count);

    for (int i = 0; i < count; i++) {
        NSString *key = [NSString stringWithUTF8String:property_getName(properties[i])];
        [dict setObject:[obj valueForKey:key] ? [obj valueForKey:key] : @"" forKey:key];
    }

    free(properties);

    return [NSDictionary dictionaryWithDictionary:dict];
}

次にこれを呼び出します:

NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dic options:0 error:&err];
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
0
刘俊利

SwiftyJSONを使用してJSONオブジェクトにアクセスする場合、JSONのdictionaryObjectプロパティを使用することが重要です(dictionaryValuedictionaryを使用する代わりに)それ以外の場合は、このエラー(またはそのバリエーション)が発生します。例えば:

guard let jsonDict = json.dictionaryObject else {
    return
}

let jsonData = try JSONSerialization.data(withJSONObject: jsonDict, options: [])
0
Tamás Sengel

私の場合、誤って文字列ではなくオブジェクトをパラメータディクショナリに追加しました

0
Dan Precup

このメソッドも呼び出して、パラメーターをJSONオブジェクトに変換できるかどうかを確認できます。これにより、Boolが返されます。

let checker = JSONSerialization.isValidJSONObject(parameters)

Foundation SetにリンクされているNSSetを使用すると、このエラーが発生しました。

let myArray = Array(mySet)
0
yoAlex5