1

我在将核心数据托管对象序列化为 JSON 对象时遇到问题。我正在使用 Mantle 来执行此操作,这是相关的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];

这就是我格式化NSDateinMTLModel

+ (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

我只是想以使用 Mantle 时可以使用的方式发布上述答案。(希望这对其他人有帮助)

+ (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 回答
1

我知道这是一个老问题,但这是我的答案。

NSDate从de文档页面,我们可以找到如何处理MTLModel

GHIssue.h

@interface GHIssue : MTLModel <MTLJSONSerializing>

...
@property (nonatomic, copy, readonly) NSDate *updatedAt;
...

@end

GHIssue.m

@implementation GHIssue

+ (NSDateFormatter *)dateFormatter {
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
    dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss'Z'";
    return dateFormatter;
}

+ (NSDictionary *)JSONKeyPathsByPropertyKey {
    return @{
        ...
        @"updatedAt": @"updated_at"
    };
}

+ (NSValueTransformer *)updatedAtJSONTransformer {
    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];
    }];
}

文档链接:https ://github.com/Mantle/Mantle#mtlmodel

于 2017-05-09T22:45:07.323 回答