为什么以下代码会给我错误:
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
}
答案 0 :(得分:42)
我遇到了这个问题,因为我的一个字符串是可选的。它试图序列化一个值,如: "可选(\"字符串值\")"
而不是"字符串值"
答案 1 :(得分:32)
如果您的问题仍未通过此处给出的答案解决。我相信parameters
中的一个对象可能不是NSString
,NSNumber
,NSArray
,NSDictionary
或NSNull
的实例。正如JSONSerialization
类的文档中所述:
可以转换为JSON的对象必须具有以下属性:
顶级对象是NSArray或NSDictionary。 所有对象都是NSString,NSNumber,NSArray,NSDictionary或NSNull的实例。
所有字典键都是NSString的实例。 数字不是NaN或无穷大。
- 醇>
其他规则可能适用。调用isValidJSONObject(_ :)或尝试转换是判断给定对象是否可以转换为JSON数据的明确方法。
因此,请检查parameters
对象中的任何对象是否不满足上述约束。
答案 2 :(得分:8)
万一有人仍然遇到问题而且正在使用Enums,另一个原因可能是你传递的是Enum值而不是它的rawValue。
示例:
enum Status: String {
case open
case closed
}
而不是传递枚举:
params = ["status": Status.open]
<强>通过强>
params = ["status": Status.open.rawValue]
答案 3 :(得分:0)
如果您使用 SwiftyJSON 来访问JSON对象,那么使用JSON的 dictionaryObject
属性非常重要(而不是使用{{1 }},dictionaryValue
或者根本没有任何东西),因为否则会出现此错误(或其变体)。例如:
dictionary
答案 4 :(得分:0)
首先应该将Picasso.with(context).load(favoritesList.get(position).getFoodImage())
.into(viewHolder.food_image);
转换为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];
}
答案 5 :(得分:0)
使用与基金会Set
链接的NSSet
时出现此错误。
let myArray = Array(mySet)
答案 6 :(得分:0)
您也可以调用此方法,看看是否可以将您的参数转换为JSON对象,这将返回一个布尔值。
let checker = JSONSerialization.isValidJSONObject(parameters)
答案 7 :(得分:0)
就我而言,我不小心将一个对象而不是字符串添加到了Parameters字典中
答案 8 :(得分:0)
我遇到此 runtime 错误,因为我的字典是这样的:
var dictionary: [AnyHashable: Any] = [:]
let elapsedTime = Date.timeIntervalSince(oldDate)
dictionary["elapsedTime"] = elapsedTime
您能告诉我问题出在哪里吗? 将鼠标悬停在下面的框中以查看答案!
elapsedTime
的类型为Function
,而不是TimeInterval
。 我需要将Date.
更改为Date().
,即使用实例方法而不是静态方法。 当您的字典值是Any
时,直到运行时错误无法将字典序列化为JSON字符串,才发现此类问题...
答案 9 :(得分:0)
与您有相同的问题和错误!终于找到了问题...
我的代码:
params = [
"gender": request.gender.first ?? "",
"age": 15
]
问题:即使request.gender.first ?? ""
返回一个字符串,其类型仍为String.Element
,任何JSONEncoder
或JSONSerialization
都无法编码(并且根据文档,它不在可处理的类型列表中。
解决方案:
params = [
"gender": request.gender.first?.description ?? "",
"age": 15
]
通常,只需确保其为编码器可以处理的字符串或适当的数字...