2013-01-15 15 views
14

जब मैं JSON एनएसडीएटी ऑब्जेक्ट को एन्कोड करने का प्रयास करता हूं तो मुझे यह अपवाद मिल रहा है। मेरा मानना ​​है कि एनएसडीएटी जेएसओएन एन्कोडिंग के लिए संगत नहीं है। लेकिन मुझे तारीख को एन्कोड करना होगा। कोई समाधान?NSInvalidArgumentException, कारण: 'JSON लिखने में अमान्य प्रकार (__NSDate)'

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

उत्तर

11

FIrst एनएसएसटींग में अपना डेटा स्टोर करें। और फिर अपनी स्ट्रिंग को NSDate में कनवर्ट करें।

आप ऐसा उल्लेख कर सकते हैं:

Converting NSString to NSDate (and back again)

NSString to NSDate conversion problem

How to convert NSString to NSDate using NSDateFormatter?

+1

यह समझ में नहीं आता है। ओपी पूछ रहा है कि ** ** एनएसडीएटी को कैसे एन्कोड करें। इसका मतलब है कि उन्हें एनएसडीएटी को एनएसटीटींग में उस शब्दकोश में डालने से पहले कनवर्ट करना चाहिए जो वे JSON एन्कोड करने का प्रयास कर रहे हैं। मेरा उत्तर नीचे एक उदाहरण समाधान दिखाता है। – sumizome

+0

कोई अच्छा समाधान नहीं है। यह सिर्फ एक बाई पास है। मुझे यह जानने की जरूरत है कि इसे एनएसडीएटी के साथ कैसे काम करना है या यदि नहीं, तो यह क्यों हो रहा है। – Nishant

7

NSString में कनवर्ट NSDate और एन्कोड करने के लिए प्रयास करें।

- (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; 
} 
0

आपको इसे एन्कोड करने का प्रयास करने से पहले तारीख को एक स्ट्रिंग में परिवर्तित करना होगा। हर जगह पर्याप्त उदाहरण हैं इसलिए

4

क्या आपने कोशिश की है?

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

के रूप में वर्णित यहाँ: कुछ में

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

2. एम्बेड करें: SDK not supporting NSDate objects

इन कदम का पालन करें:

1. कन्वर्ट JSON प्रारूप में दिनांक सरणी और सरणी पोस्ट करें।

+3

पृथ्वी पर क्यों आप फ्लोट का उपयोग करेंगे? फ्लोट में 24 बिट सटीक हैं। 1 9 70 से एक अरब सेकंड से अधिक है। जिसका मतलब है कि आपका संकल्प एक मिनट से भी बदतर है। आपका दिनांक प्रारूप बिल्कुल गैर-मानक है। – gnasher729

4

जैसा कि ध्यान दिया गया है, आपको पहले अपने एनएसडीएटी को एनएसएसटींग में परिवर्तित करना होगा। यह तुरंत स्पष्ट नहीं है, हालांकि, दिनांक को किस प्रारूप में प्रदर्शित किया जाना चाहिए। उत्तर here पाया जा सकता है: "JSON स्वयं निर्दिष्ट नहीं करता कि तारीखों का प्रतिनिधित्व कैसे किया जाना चाहिए, लेकिन जावास्क्रिप्ट करता है" - ISO8601।

- (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 के लिए एक सहायक वर्ग से एक ISO8601 रूपांतरण विधि, शिष्टाचार Erica Sadun है 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)]; 
} 
2

की दुकान और पुनः प्राप्त JSON में एक NSDate वस्तु NSDate की timeIntervalSince1970 संपत्ति का उपयोग किया जाएगा करने के लिए सबसे आसान तरीका है।

लौटे NSTimeInterval (डबल) सुंदर मानक है और आसानी से उपयोग कर एक NSDate वस्तु को वापस परिवर्तित किया जा सकता:

NSDate dateWithTimeIntervalSince1970:<#(NSTimeInterval)#> 
0

हमारे मामले के लिए, हम मेंटल उपयोग कर रहे हैं JSON और एक के लिए एक वस्तु कन्वर्ट करने के लिए संपत्ति NSDate के साथ हमारे वस्तुओं के अपने 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; 
} 
संबंधित मुद्दे