JSONSerialization JSON 写入中的类型无效 (_SwiftValue)
Posted
技术标签:
【中文标题】JSONSerialization JSON 写入中的类型无效 (_SwiftValue)【英文标题】:JSONSerialization Invalid type in JSON write (_SwiftValue) 【发布时间】:2016-09-15 22:45:33 【问题描述】:为什么下面的代码给我错误:
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
【问题讨论】:
如果我做对了,你的"status"
键包含code
值,它的类型是Enum
,那么就会出现这个错误。将代码更改为code.rawValue
。
【参考方案1】:
如果此处给出的答案仍未解决您的问题。我相信parameters
中的一个对象可能不是NSString
、NSNumber
、NSArray
、NSDictionary
或NSNull
的实例。如JSONSerialization
类的文档中所述:
可以转换为 JSON 的对象必须具有以下属性:
***对象是 NSArray 或 NSDictionary。 所有对象都是 NSString、NSNumber、NSArray、NSDictionary 或 NSNull 的实例。
所有字典键都是 NSString 的实例。 数字不是 NaN 或无穷大。
可能适用其他规则。调用 isValidJSONObject(_:) 或尝试转换是判断给定对象是否可以转换为 JSON 数据的明确方法。
所以,请检查您的parameters
对象中是否有任何对象不满足上述限制。
【讨论】:
在我的情况下,每个键值都很好,但我仍然收到此错误@KrishnaCA @Mansuu....如果您的字符串是可选的,请检查是否有一个,如下所示 如何将我的可编码类对象转换为有效的 JSON 对象?【参考方案2】:我遇到了这个问题,这是因为我的字符串之一是可选的。它试图序列化一个值,如: "可选(\"字符串值\")"
而不是“字符串值”
【讨论】:
我也是,只是不得不将我的参数设为字符串而不是字符串?。 当你的 JSON 中必须有一个空值时你会怎么做?根据http://www.json.org/,JSON 可以保存空值。 也解决了我的问题。我认为这是 Swift 3 的第一个 NSNull() 值,但它仅来自可选字符串。 rudenudedude 这样的东西对我有用让参数:[String: Any] = ["someValue": ["someNestedValueKey": min ?? NSNull(), ] ]【参考方案3】:以防万一有人仍然遇到问题并且正在使用 Enums,另一个原因可能是您传递的是 Enum 值而不是 rawValue。
例子:
enum Status: String
case open
case closed
而不是传递枚举:
params = ["status": Status.open]
通过
params = ["status": Status.open.rawValue]
【讨论】:
正是这个!谢谢:)【参考方案4】:你也可以调用这个方法,看看你的参数是否可以转换为JSON对象,这将返回一个Bool。
let checker = JSONSerialization.isValidJSONObject(parameters)
【讨论】:
【参考方案5】:在我的例子中,我不小心将对象而不是字符串添加到了参数字典中
【讨论】:
【参考方案6】:如果您使用 SwiftyJSON 访问 JSON 对象,请务必使用 JSON 的 dictionaryObject
属性(而不是使用 dictionaryValue
、@ 987654323@ 或什么都没有),否则你会得到这个错误(或它的变体)。例如:
guard let jsonDict = json.dictionaryObject else
return
let jsonData = try JSONSerialization.data(withJSONObject: jsonDict, options: [])
【讨论】:
你先生,是个传奇。请知道。【参考方案7】:使用与 Foundation NSSet
链接的 Set
时出现此错误。
let myArray = Array(mySet)
【讨论】:
【参考方案8】:和你有同样的问题和错误!终于找到问题了...
我的代码:
params = [
"gender": request.gender.first ?? "",
"age": 15
]
问题:尽管request.gender.first ?? ""
返回一个字符串,但它的类型是String.Element
,任何JSONEncoder
或JSONSerialization
都无法编码(并且不在它的类型列表中可以处理,根据文档)。
解决方案:
params = [
"gender": request.gender.first?.description ?? "",
"age": 15
]
通常,只需确保它是编码器可以处理的字符串或适当的数字...
【讨论】:
【参考方案9】:首先你应该将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];
【讨论】:
【参考方案10】:我收到了这个 runtime 错误,因为我的字典是这样的:
var dictionary: [AnyHashable: Any] = [:]
let elapsedTime = Date.timeIntervalSince(oldDate)
dictionary["elapsedTime"] = elapsedTime
你能告诉我问题是什么吗? 将鼠标悬停在下面的方框上以查看答案!
elapsedTime
的类型是Function
它不是TimeInterval
。 我需要将Date.
更改为Date().
,即使用实例方法而不是静态方法。 当您的字典值为Any
时,直到出现无法将字典序列化为 JSON 字符串的运行时错误,才会发现此类问题...
【讨论】:
以上是关于JSONSerialization JSON 写入中的类型无效 (_SwiftValue)的主要内容,如果未能解决你的问题,请参考以下文章
Swift - JSONSerialization 无效的 JSON
Swift - JSONSerialization 无效的 JSON
java JSONSerialization(JAVA到JSON)