次のコードでエラーが発生するのはなぜですか:
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
}
ここに記載されている回答で問題が解決しない場合。 parameters
内のオブジェクトの1つは、NSString
、NSNumber
、NSArray
、NSDictionary
、またはNSNull
のインスタンスではない可能性があると思います。 JSONSerialization
クラスのドキュメントに記載されているとおり:
JSONに変換できるオブジェクトには、次のプロパティが必要です。
最上位のオブジェクトはNSArrayまたはNSDictionaryです。すべてのオブジェクトは、NSString、NSNumber、NSArray、NSDictionary、またはNSNullのインスタンスです。
すべての辞書キーはNSStringのインスタンスです。数値はNaNまたは無限ではありません。
他の規則が適用される場合があります。 isValidJSONObject(_ :)を呼び出すか、変換を試みることが、特定のオブジェクトをJSONデータに変換できるかどうかを判断する決定的な方法です。
したがって、parameters
オブジェクト内のオブジェクトのいずれかが上記の制約を満たさないかどうかを確認してください。
この問題が発生したのは、文字列の1つがオプションであったためです。次のような値をシリアル化しようとしました: "Optional(\" string value\")"
「文字列値」の代わりに
誰かがまだ問題を抱えていてEnumsを使用している場合に備えて、rawValueではなくEnum値を渡している場合に別の原因が考えられます。
例:
enum Status: String {
case open
case closed
}
enumを渡す代わりに:
params = ["status": Status.open]
パス
params = ["status": Status.open.rawValue]
最初にNSObject
をNSDictionary
に変換する必要があります
これを試して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];
SwiftyJSONを使用してJSONオブジェクトにアクセスする場合、JSONのdictionaryObject
プロパティを使用することが重要です(dictionaryValue
、dictionary
を使用する代わりに)それ以外の場合は、このエラー(またはそのバリエーション)が発生します。例えば:
guard let jsonDict = json.dictionaryObject else {
return
}
let jsonData = try JSONSerialization.data(withJSONObject: jsonDict, options: [])
私の場合、誤って文字列ではなくオブジェクトをパラメータディクショナリに追加しました
このメソッドも呼び出して、パラメーターをJSONオブジェクトに変換できるかどうかを確認できます。これにより、Boolが返されます。
let checker = JSONSerialization.isValidJSONObject(parameters)
Foundation Set
にリンクされているNSSet
を使用すると、このエラーが発生しました。
let myArray = Array(mySet)