为什么以下代码会给我错误:
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
内的一个物体可能不是NSString
,NSNumber
,NSArray
,NSDictionary
或NSNull
的一个例子。正如JSONSerialization
类的文档中所给出的:
可以转换为JSON的对象必须具有以下属性:
- 顶级对象是NSArray或NSDictionary。所有对象都是NSString,NSNumber,NSArray,NSDictionary或NSNull的实例。
- 所有字典键都是NSString的实例。数字不是NaN或无穷大。
- 其他规则可能适用。调用isValidJSONObject(_ :)或尝试转换是判断给定对象是否可以转换为JSON数据的明确方法。
因此,请检查parameters
对象中的任何对象是否不满足上述约束。
我有这个问题,因为我的一个字符串是可选的。它试图序列化一个值,如:“Optional(\”string value \“)”
而不是“字符串值”
万一有人仍然遇到问题而且正在使用枚举,另一个原因可能是你传递了一个枚举值而不是它的rawValue。
例:
enum Status: String {
case open
case closed
}
而不是传递枚举:
params = ["status": Status.open]
通过
params = ["status": Status.open.rawValue]
如果您使用SwiftyJSON访问JSON对象,则使用JSON的dictionaryObject
属性非常重要(而不是使用dictionaryValue
,dictionary
或者根本不使用),因为否则会出现此错误(或其变体)。例如:
guard let jsonDict = json.dictionaryObject else {
return
}
let jsonData = try JSONSerialization.data(withJSONObject: jsonDict, options: [])
你应该首先将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];
当使用与Foundation Set
链接的NSSet
时,我收到此错误。
let myArray = Array(mySet)
您也可以调用此方法,看看您的参数是否可以转换为JSON对象,这将返回一个Bool。
let checker = JSONSerialization.isValidJSONObject(parameters)
在我的情况下,我不小心将一个对象添加到Parameters字典而不是字符串