web-dev-qa-db-ja.com

NSInvalidArgumentException、理由: 'JSON書き込みで無効なタイプ(__NSDate)'

NSDateオブジェクトをJSONエンコードしようとすると、この例外が発生します。NSDateはJSONエンコードに対応していないと思います。しかし、私は日付をエンコードする必要があります。

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid type in JSON write (__NSDate)'
22
Harikrishnan

最初にデータをNSStringに保存します。次に、文字列をNSDateに変換します。

あなたはSOを参照することができます:

NSStringをNSDateに変換する(そして再び戻す)

NSStringからNSDateへの変換の問題

NSDateFormatterを使用してNSStringをNSDateに変換する方法

12
Rushi

NSDateをNSStringに変換し、エンコードしてみます。

- (NSString *) changeDateToDateString :(NSDate *) date {

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setTimeZone:[NSTimeZone localTimeZone]];
    NSLocale *locale = [NSLocale currentLocale];
    NSString *dateFormat = [NSDateFormatter dateFormatFromTemplate:@"hh mm" options:0 locale:locale];
    [dateFormatter setDateFormat:dateFormat];
    [dateFormatter setLocale:locale];
    NSString *dateString = [dateFormatter stringFromDate:date];
    return dateString;
}
7
pradeepa

やってみました ?

updateDate = [NSNumber numberWithFloat:[[NSDate date] timeIntervalSince1970]];

ここで説明されているように: SDKはNSDateオブジェクトをサポートしていません

これらに従ってくださいステップ:

1。 JSON形式で日付を変換します:

 NSDateFormatter *formatter = [[[NSDateFormatter alloc] init]autorelease];
 [formatter setDateFormat:@"Z"];
 NSString *updateDate = [NSString stringWithFormat:@"/Date(%.0f000%@)/", [[NSDate date] timeIntervalSince1970],[formatter stringFromDate:[NSDate date]]];

2。いくつかの配列に埋め込むPOST配列。

4
Bhavin

前述のように、まずNSDateをNSStringに変換する必要があります。ただし、日付をどの形式で表現するかはすぐにはわかりません。答えは次のとおりです here :「日付の表現方法はJSON自体では指定されていませんが、JavaScriptでは指定されています」-ISO8601。

これは、NSDateのヘルパーカテゴリからのISO8601変換メソッドです。礼儀 Erica Sadun

- (NSString *)ISO8601 {
    struct tm time;
    time_t interval = [self timeIntervalSince1970];
    gmtime_r(&interval, &time);
    char *x = calloc(1, 21);
    strftime_l(x, 20, "%FT%TZ", &time, gmtlocale);
    NSString *string = [NSString stringWithUTF8String:x];
    free(x);
    return string;
}

JSONペイロードでISO8601文字列を取得し、それをNSDateに変換する場合は、NSDateに次のクラスメソッドを使用します。

+ (NSDate *)dateFromISO8601:(NSString *)string {
    if(!string) return nil;
    if (![string isKindOfClass:[NSString class]]) return nil;
    struct tm time;
    strptime_l([string UTF8String], "%FT%TZ", &time, gmtlocale);
    return [NSDate dateWithTimeIntervalSince1970:timegm(&time)];
}
4
sumizome

JSONでNSDateオブジェクトを保存および取得する最も簡単な方法は、NSDateのtimeIntervalSince197プロパティを使用することです。

返されるNSTimeInterval(double)はかなり標準的であり、次を使用してNSDateオブジェクトに簡単に変換できます。

NSDate dateWithTimeIntervalSince1970:<#(NSTimeInterval)#>
2
Julius

エンコードする前に、日付を文字列に変換する必要があります。どこにでも十分な例があるので、見つけやすいはずです

1
Ismael

私たちのケースでは、オブジェクトをJSONに変換するためにMantleを使用していますが、プロパティNSDateを持つオブジェクトの1つにJSONTransformerがありません

@property (nonatomic) NSDate *expiryDate;

どこ:

+ (NSValueTransformer *)expiryDateJSONTransformer {
     return [MTLValueTransformer transformerUsingForwardBlock:^id(NSString *dateString, BOOL *success, NSError *__autoreleasing *error) {
        return [self.dateFormatter dateFromString:dateString];
    } reverseBlock:^id(NSDate *date, BOOL *success, NSError *__autoreleasing *error) {
        return [self.dateFormatter stringFromDate:date];
    }];
}

+ (NSDateFormatter *)dateFormatter {
    NSDateFormatter *df = [NSDateFormatter new];
    df.dateFormat = @"yyyy-MM-dd";
    return df;
}
0
Ted

私は私の体のパラメータエンコーダでこのようなことをしています

// handle dates
              var _params = [String: Any]()
              params.forEach { (key, value) in
                if let date = value as? Date {
                    _params[key] = DateFormatter.iso8601Full.string(from: date)
                } else {
                    _params[key] = value
                }
              }

              return try? JSONSerialization.data(withJSONObject: _params)
0
Michał Ziobro