【问题标题】:JSONSerialization Invalid type in JSON write (_SwiftValue)JSONSerialization JSON 写入中的类型无效 (_SwiftValue)
【发布时间】:2017-01-24 02:08:21
【问题描述】:

为什么下面的代码给我错误:

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

标签: alamofire swift3


【解决方案1】:

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

而不是“字符串值”

【讨论】:

  • 我也是,只是不得不将我的参数设为字符串而不是字符串?。
  • 当你的 JSON 中必须有一个空值时你会怎么做?根据http://www.json.org/,JSON 可以保存空值。
  • 也解决了我的问题。我认为这是 Swift 3 的第一个 NSNull() 值,但它仅来自可选字符串。
  • rudenudedude 这样的东西对我有用让参数:[String: Any] = ["someValue": ["someNestedValueKey": min ?? NSNull(), ] ]
【解决方案2】:

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

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

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

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

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

所以,请检查您的parameters 对象中是否有任何对象不满足上述限制。

【讨论】:

  • 在我的情况下,每个键值都很好,但我仍然收到此错误@KrishnaCA
  • @Mansuu....如果您的字符串是可选的,请检查是否有一个,如下所示
  • 如何将我的可编码类对象转换为有效的 JSON 对象?
【解决方案3】:

以防万一有人仍然遇到问题并且正在使用 Enums,另一个原因可能是您传递的是 Enum 值而不是 rawValue。

例子:

enum Status: String {
  case open
  case closed
}

而不是传递枚举

params = ["status": Status.open]

通过

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

【讨论】:

  • 正是这个!谢谢:)
【解决方案4】:

如果您使用 SwiftyJSON 访问 JSON 对象,请务必使用 JSON 的 dictionaryObject 属性(而不是使用 dictionaryValue、@ 987654323@ 或什么都没有),否则你会得到这个错误(或它的变体)。例如:

guard let jsonDict = json.dictionaryObject else {
    return
}

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

【讨论】:

  • 你先生,是个传奇。请知道。
【解决方案5】:

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

【讨论】:

    【解决方案6】:

    使用与 Foundation NSSet 链接的 Set 时出现此错误。

    let myArray = Array(mySet)
    

    【讨论】:

      【解决方案7】:

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

      let checker = JSONSerialization.isValidJSONObject(parameters)
      

      【讨论】:

        【解决方案8】:

        在我的例子中,我不小心将对象而不是字符串添加到了参数字典中

        【讨论】:

          【解决方案9】:

          我收到此 runtime 错误,因为我的字典是这样的:

          var dictionary: [AnyHashable: Any] = [:]
          let elapsedTime = Date.timeIntervalSince(oldDate)
          dictionary["elapsedTime"] = elapsedTime
          

          你能告诉我问题是什么吗? 将鼠标悬停在下面的方框上查看答案!

          elapsedTime 的类型是 Function 它不是 TimeInterval。 我需要将Date. 更改为Date().,即使用实例方法而不是静态方法。 当您的字典值为Any 时,直到出现无法将字典序列化为 JSON 字符串的运行时错误时才会发现此类问题...

          【讨论】:

            【解决方案10】:

            和你有同样的问题和错误!终于找到问题了...

            我的代码

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

            问题:尽管request.gender.first ?? "" 返回一个字符串,但它的类型为String.Element,任何JSONEncoderJSONSerialization 都无法编码​​(并且不在它的类型列表中可以处理,根据文档)。

            解决方案

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

            通常,只需确保它是一个字符串或编码器可以处理的适当数字...

            【讨论】:

              猜你喜欢
              • 2020-04-03
              • 2017-01-27
              • 2017-03-12
              • 2019-06-13
              • 1970-01-01
              • 2015-11-16
              • 2019-10-26
              相关资源
              最近更新 更多