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

时间:2016-09-15 22:45:33

标签: alamofire swift3

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

  

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
    }

10 个答案:

答案 0 :(得分:42)

我遇到了这个问题,因为我的一个字符串是可选的。它试图序列化一个值,如: "可选(\"字符串值\")"

而不是"字符串值"

答案 1 :(得分:32)

如果您的问题仍未通过此处给出的答案解决。我相信parameters中的一个对象可能不是NSStringNSNumberNSArrayNSDictionaryNSNull的实例。正如JSONSerialization类的文档中所述:

  

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

     
      
  1. 顶级对象是NSArray或NSDictionary。   所有对象都是NSString,NSNumber,NSArray,NSDictionary或NSNull的实例。

  2.   
  3. 所有字典键都是NSString的实例。   数字不是NaN或无穷大。

  4.   
  5. 其他规则可能适用。调用isValidJSONObject(_ :)或尝试转换是判断给定对象是否可以转换为JSON数据的明确方法。

  6.   

因此,请检查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,任何JSONEncoderJSONSerialization都无法编码​​(并且根据文档,它不在可处理的类型列表中。

解决方案

params = [
    "gender": request.gender.first?.description ?? "",
    "age": 15
]

通常,只需确保其为编码器可以处理的字符串或适当的数字...