1

コア データ管理オブジェクトを JSON オブジェクトにシリアライズする際に問題があります。私はこれを行うためにマントルを使用していますが、これは関連していNSDateます。このエラーが発生しています。

'Invalid type in JSON write (__NSDate)'

これは、この例外がスローされている場所です。コード 4 行目までは問題ありません (NSDictionary *jDict ....)

        //NSManagedObject from Core Data
        Memo *newMemo = [self fetchMemo:memo.uuid];

        NSError *errorMantle;

        //MTLModel model
        BSMemo *memooo = [MTLManagedObjectAdapter modelOfClass:[BSMemo class] fromManagedObject:newMemo error:&errorMantle];

        NSDictionary *jDict = [MTLJSONAdapter JSONDictionaryFromModel:memooo];

        //Serialising using NSJSONSerialization
        NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jDict options:NSJSONWritingPrettyPrinted error:&error];

これは私がフォーマットしている方法NSDateですMTLModel

+ (NSValueTransformer *)dateJSONTransformer {
    static dispatch_once_t onceToken;
    static NSDateFormatter *dateFormatter;

    dispatch_once(&onceToken, ^{
        dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"YYYY-MM-dd'T'HH:mm:ssZZZ"];

    });

    return [MTLValueTransformer transformerWithBlock:^id(NSString *string) {
        return [dateFormatter dateFromString:string];
    }];
}

+ (NSValueTransformer *)createdJSONTransformer {
    return [self dateJSONTransformer];
}

JSON の解析は正常に行われます。これは、コア データから JSON 文字列を生成しようとした場合にのみ発生します。別の日付形式で試しました。しかし、運がありません。これを克服する方法を教えてください。

更新されたブロック

+ (NSValueTransformer *)dateJSONTransformer {
    __block dispatch_once_t onceToken;
    __block NSDateFormatter *dateFormatter;

    dispatch_once(&onceToken, ^{

        dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"YYYY-MM-dd'T'HH:mm:ssZZZ"];
    });

    return [MTLValueTransformer transformerWithBlock:^id(NSString *string) {
        return [dateFormatter dateFromString:string];
    }];
}

Rest JSON API からいくつかのデータをダウンロードして、コア データに保存しています。私のアプリはオフラインで作業する必要があるためです。データをサーバーにプッシュバックしようとするとき、コア データを JSON に変換し、HTTP POST で添付する必要があります。そのため、このプロセスを簡素化するために Mantle を使用しています。

4

3 に答える 3

5

マントルを使用するときに使用できる方法で上記の回答を投稿することを考えました。(これが他の人に役立つことを願っています)

+ (NSValueTransformer *)dateJSONTransformer {
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"YYYY-MM-dd'T'HH:mm:ssZZZ"];


    return [MTLValueTransformer reversibleTransformerWithForwardBlock:^(NSString *str) {
        NSDate *date = [dateFormatter dateFromString:str];
        return date;
    } reverseBlock:^(NSDate *date) {
        return [dateFormatter stringFromDate:date];
    }];
}

次に、次のように NSDate を使用する必要があるときはいつでも呼び出します

+ (NSValueTransformer *)createdJSONTransformer {
    return [self dateJSONTransformer];
}
于 2014-08-04T10:43:48.357 に答える
4

このようにしてみてください

+ (NSDate*)dateJSONTransformer:(NSString*)dateString {
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"YYYY-MM-dd'T'HH:mm:ssZZZ"];
        return [dateFormatter dateFromString:dateString];
}
于 2014-08-04T10:10:03.343 に答える