Ios 为什么我不能将这个NSArray序列化?

Ios 为什么我不能将这个NSArray序列化?,ios,objective-c,Ios,Objective C,我试图JSONSerialize从NSFetchRequest中获取的NSArray,但当我调用isValidJSONObject时,我最终进入了一个部分,它告诉我它无效 代码如下所示,我在调试的“不工作”部分结束 + (int) synchOrder:(NSString *)orderNumber { if ([NWTillHelper isDebug] == 1) { NSLog(@"WebServices:synchOrder:ordernumber = %@",

我试图JSONSerialize从NSFetchRequest中获取的NSArray,但当我调用isValidJSONObject时,我最终进入了一个部分,它告诉我它无效

代码如下所示,我在调试的“不工作”部分结束

+ (int) synchOrder:(NSString *)orderNumber {
    if ([NWTillHelper isDebug] == 1) {
        NSLog(@"WebServices:synchOrder:ordernumber = %@", orderNumber);
    }

    AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication]delegate];

    NSManagedObjectContext *context = appDelegate.persistentContainer.viewContext;

    // *** Fetch the orderHead information

    // *** The query for all tables uses orderNumber as selection so we set that up first for re use
    NSPredicate *predicateOrderNumber =[NSPredicate predicateWithFormat:@"orderNumber like[cd] %@", [NWTillHelper getCurrentOrderNumber]];

    NSFetchRequest *fetchRequestOh = [[NSFetchRequest alloc] initWithEntityName:@"OrderHead"];
    NSFetchRequest *fetchRequestOrp = [[NSFetchRequest alloc] initWithEntityName:@"OrderRow"];
    NSFetchRequest *fetchRequestTender = [[NSFetchRequest alloc] initWithEntityName:@"Tender"];

    fetchRequestOh.predicate = predicateOrderNumber;
    fetchRequestOrp.predicate = predicateOrderNumber;
    fetchRequestTender.predicate = predicateOrderNumber;

    fetchRequestOh.resultType = NSDictionaryResultType;
    fetchRequestOrp.resultType = NSDictionaryResultType;
    fetchRequestTender.resultType = NSDictionaryResultType;

    NSError *errorOh = nil;
    NSArray *orderHeads = [[context executeFetchRequest:fetchRequestOh error:&errorOh] mutableCopy];

    NSError *errorOrp = nil;
    NSArray *orderRows = [[context executeFetchRequest:fetchRequestOrp error:&errorOrp] mutableCopy];

    NSError *errorTender = nil;
    NSArray *tenderRows = [[context executeFetchRequest:fetchRequestTender error:&errorTender] mutableCopy];

    if ([NWTillHelper isDebug] == 1) {
        NSLog(@"WebServices:synchOrder:orderHeadsArray: %@", orderHeads);
        NSLog(@"WebServices:synchOrder:orderRowsArray: %@", orderRows);
        NSLog(@"WebServices:synchOrder:tenderRowsArray: %@", tenderRows);
    }

    // *** first lets upload orderHead
    NSError *errorWebSvsOhApi;

    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];

    NSURLSession *sessionOrderHead = [NSURLSession sessionWithConfiguration:configuration delegate:nil delegateQueue:nil];

    NSURL *url = [NSURL URLWithString:@"https://XXX.YYY.ZZ:0000/path/to/api"];

    NSMutableURLRequest *requestOrderHeads = [NSMutableURLRequest requestWithURL:url
                                                           cachePolicy:NSURLRequestUseProtocolCachePolicy
                                                       timeoutInterval:60.0];

    if ([NSJSONSerialization isValidJSONObject:orderHeads]) {
NSLog(@"works");
} else {
NSLog(@"Does not work");
}
数组的调试输出如下所示

2016-12-24 11:55:38.362 NWMobileTill[1007:69570] WebServices:synchOrder:orderHeadsArray: (
        {
        amountTax = 0;
        companyId = Kalle;
        createdDateUtc = "2016-12-24 03:55:25 +0000";
        isSynched = 0;
        orderNumber = "1-20161224115525";
        orderType = 0;
        status = 0;
        sumAfterTrDiscount = 0;
        sumBeforeTrDiscount = 0;
        tillId = 1;
        trDiscountAmount = 0;
        trDiscountPercentage = 0;
        userName = 1;
    }
)

必须是工作。这是我用你自己的数据和代码做的实验。正如你所预料的那样,它工作得很好

NSArray *test = @[@{@"amountTax" : @0,
                    @"companyId" : @"Kalle",
                    @"createdDateUtc" : @"2016-12-24 03:55:25 +0000",
                    @"isSynched" : @(false),
                    @"orderNumber" : @"1-20161224115525",
                    @"orderType" : @0,
                    @"status" : @(false),
                    @"sumAfterTrDiscount" : @0,
                    @"sumBeforeTrDiscount" : @0,
                    @"tillId" : @1,
                    @"trDiscountAmount" : @0,
                    @"trDiscountPercentage" : @0,
                    @"userName" : @1
                    }];

NSLog(@"Test:%@", test);

if ([NSJSONSerialization isValidJSONObject:test]) {
    NSLog(@"works");
} else {
    NSLog(@"Does not work");
}
调试输出:

Test:(
    {
    amountTax = 0;
    companyId = Kalle;
    createdDateUtc = "2016-12-24 03:55:25 +0000";
    isSynched = 0;
    orderNumber = "1-20161224115525";
    orderType = 0;
    status = 0;
    sumAfterTrDiscount = 0;
    sumBeforeTrDiscount = 0;
    tillId = 1;
    trDiscountAmount = 0;
    trDiscountPercentage = 0;
    userName = 1;
}
)
2016-12-24 13:38:34.098 sample[2628:58572] works

isValidJSONObject用于返回一个布尔值,该值指示给定对象是否可以转换为JSON数据。如果您正在检查无效的NSArray对象,它将返回false。但是,根据您的代码和定制,我自己的数组返回有效。检查数组对象是否正确,并检查该数组是否为空。若数组为空,它将返回为false

问题在于,NSDate无法按照Vadian在评论中所述进行序列化,通过使用以下日期格式化程序,它解决了问题,并且NSArray可以正确地进行JSON序列化

按如下方式创建日期并设置日期格式化程序

NSDate *createdDate = [NSDate date];

NSDateFormatter *dateFormatterWithTz = [[NSDateFormatter alloc] init];
[dateFormatterWithTz setDateFormat:@"yyyy-MM-dd'T'HH:mm:ssZZZZZ"];
然后,在将日期保存到持久性存储时,使用如下格式设置程序

[newTenderRow setValue:[dateFormatterWithTz stringFromDate:createdDate] forKey:@"createdDate"];

自定义对象不是有效的JSON数据。请阅读
NSJSONSerialization
的文档,了解有效JSON数据的说明。问题很可能是字典中的
NSDate
值不符合JSON。是的,这是我得到正确排序后的日期格式,很可能是因为您将NSDate作为NSString编写的!?所以这不一样,你没有回答;)这是真的:(我没有检查这个数据的日期!