JSONSerialization JSON写入中的无效类型(_SwiftValue)

问题描述 投票:35回答:8

为什么以下代码会给我错误:

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
    }
alamofire swift3
8个回答
33
投票

如果您的问题仍未通过此处给出的答案解决。我相信你在parameters内的一个物体可能不是NSStringNSNumberNSArrayNSDictionaryNSNull的一个例子。正如JSONSerialization类的文档中所给出的:

可以转换为JSON的对象必须具有以下属性:

  1. 顶级对象是NSArray或NSDictionary。所有对象都是NSString,NSNumber,NSArray,NSDictionary或NSNull的实例。
  2. 所有字典键都是NSString的实例。数字不是NaN或无穷大。
  3. 其他规则可能适用。调用isValidJSONObject(_ :)或尝试转换是判断给定对象是否可以转换为JSON数据的明确方法。

因此,请检查parameters对象中的任何对象是否不满足上述约束。


44
投票

我有这个问题,因为我的一个字符串是可选的。它试图序列化一个值,如:“Optional(\”string value \“)”

而不是“字符串值”


10
投票

万一有人仍然遇到问题而且正在使用枚举,另一个原因可能是你传递了一个枚举值而不是它的rawValue。

例:

enum Status: String {
  case open
  case closed
}

而不是传递枚举:

params = ["status": Status.open]

通过

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

0
投票

如果您使用SwiftyJSON访问JSON对象,则使用JSON的dictionaryObject属性非常重要(而不是使用dictionaryValuedictionary或者根本不使用),因为否则会出现此错误(或其变体)。例如:

guard let jsonDict = json.dictionaryObject else {
    return
}

let jsonData = try JSONSerialization.data(withJSONObject: jsonDict, options: [])

0
投票

你应该首先将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];

0
投票

当使用与Foundation Set链接的NSSet时,我收到此错误。

let myArray = Array(mySet)

0
投票

您也可以调用此方法,看看您的参数是否可以转换为JSON对象,这将返回一个Bool。

let checker = JSONSerialization.isValidJSONObject(parameters)

0
投票

在我的情况下,我不小心将一个对象添加到Parameters字典而不是字符串

© www.soinside.com 2019 - 2024. All rights reserved.