2016-12-24 24 views
0

があると私はで終わりますデバッグで「動作しません」という部分があります。このNSArrayをJSONSerializeできないのはなぜですか?次のように私はNSFetchRequestから取得するが、私はisValidJSONObjectを呼び出すとき、私はそれがコード有効</p> <p>ではない私に指示節に終わることにNSArrayをJSONSerializeしようとしています

+ (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; 
    } 
) 
+1

カスタムオブジェクトではない、次のようにフォーマッタを使用して永続ストレージへの日付を保存するとき有効なJSONデータ。有効なJSONデータの説明については、 'NSJSONSerialization'のドキュメントを読んでください。 – rmaddy

+1

問題は、JSONに準拠していない辞書のNSDate値の可能性が高いです。 – vadian

+0

はい、私はそれが正常にソートされたら、日付形式でした –

答えて

0

これは動作する必要があります。これは自分のデータとコードからの私の実験です。期待どおりに動作しています。

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として返されます。

+0

NSStringとしてNSDateを書いたからでしょうか? –

+0

はい、私は文字列として書いています。 –

+0

これは同じではなく、答えはありません;) –

0

問題はヴァディアンは、それが問題を解決し、NSArrayのが適切

JSONSerializedすることができ、次の日付フォーマッタを使用することによって、コメントに記載されているようにNSDateをシリアル化することができないということでした、次のように日付を作成しますが、セットアップたDateFormatter

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"]; 
関連する問題

 関連する問題