1

サーバーからデータを正常に取得しています。それを取得した後、データを関数に送信して解析します。

- (void)readIn:(NSMutableData *)s {
    NSLog(@"Reading in the following:");
    NSString * prints = [[NSString alloc] initWithData:s  encoding:NSUTF8StringEncoding];
    NSLog(@"%@", prints);

    NSError *error = nil;
    NSData *jsonData = [[NSData alloc] initWithData:s];

    if (jsonData) {

        id jsonObjects = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&error];

        if ([jsonObjects isKindOfClass: [NSArray class]])
            NSLog(@"yes we got an Array");
        else if ([jsonObjects isKindOfClass: [NSDictionary class]])
             NSLog(@"yes we got an dictionary");
        else
              NSLog(@"neither array nor dictionary!");



        if (error) {
            NSLog(@"error is %@", [error localizedDescription]);
            return;
        }

        NSArray *keys = [jsonObjects allKeys];
        for (NSString *key in keys) {
            NSLog(@"%@ is %@",key, [jsonObjects objectForKey:key]);
        }

    } else {

        // Handle Error
    } 
    }

今、コンソールでの私の印刷は次のとおりです。

    2012-08-17 13:59:57.667 TaraftarlikOyunu[1157:c07] Reading in the following:
2012-08-17 13:59:57.667 TaraftarlikOyunu[1157:c07] {"uID":"5878341","tm":"fb","hh":122,"pt":75,"coin":500,"ll":1,"qlevel":1,"coect":true,"potWeekly":{"pts":75,"intval":604800000},"acent":{"chamunt":0},"mes":[]}
2012-08-17 13:59:57.668 TaraftarlikOyunu[1157:c07] neither array nor dictionary!
2012-08-17 13:59:57.670 TaraftarlikOyunu[1157:c07] error is The operation couldn’t be completed. (Cocoa error 3840.)

私には合法的なjsonオブジェクトのようです。私はどこで間違っていますか?

nsstream を使用してサーバーからデータを取得しています。ここにデータを取得するための私のコードがあります:

case NSStreamEventHasBytesAvailable: {
            if(stream == inputStream) {
                NSLog(@"inputStream is ready.");

                uint8_t buf[1024];
                unsigned int len = 0;

                len = [inputStream read:buf maxLength:1024];
            NSLog(@"length %i", len);
                if(len > 0) {

                    NSMutableData* data=[[NSMutableData alloc] initWithLength:0];
                    [data appendBytes: (const void *)buf length:len];
                    [self readIn:data];

                }
            }
            break;
        }
4

4 に答える 4

0

jsonObjects を明示的に配列に設定してみてください。

NSError *myError = nil;

NSArray *jsonObjects= [NSJSONSerialization JSONObjectWithData:responseData   ptions:NSJSONReadingMutableLeaves error:&myError];


for (NSDictionary * dict in jsonObjects) {
    NSLog(@"Some data %@", [dict objectForKey:@"field"]);
    //replace this to access a valid field
  }
于 2012-08-17T11:13:10.720 に答える
0

JSON は、JSON ドキュメント内のタブ、フォーム フィード、キャリッジ リターン、およびライン フィード以外の制御文字を受け入れないため、コードは完全に正常に動作し、何も読み取らずに想定どおりに動作します。

では、そのヌル文字はどこから来たのでしょうか? データを読み取るコードが間違っているか、サーバーが間違っています。問題はサーバーにあるように私には見えます。最後の文字を捨てることによる「修正」は悪いです。サーバーが修正された場合、閉じ括弧を破棄します。サーバーの責任者に連絡して、そこで問題を解決します。

于 2014-03-10T16:01:53.230 に答える
0

問題は、取得したjson文字列の最後にnull終端があり、逆シリアル化しようとすると、NSDictionaryまたはNSArrayに変換できないことです。コードを少し変更するだけで、すべてが完璧になります。真のコードはそのようにする必要があります

case NSStreamEventHasBytesAvailable: {
        if(stream == inputStream) {

            NSLog(@"inputStream is ready.");

            uint8_t buf[1024];
            unsigned int len = 0;

            len = [inputStream read:buf maxLength:1024];
            NSLog(@"length %i", len);
            if(len > 0) {

                datum =[[NSMutableData alloc] initWithLength:0];

                [datum appendBytes: (const void *)buf length:len-1];




                NSDictionary * jsondict = [NSJSONSerialization JSONObjectWithData:datum options:NSUTF8StringEncoding error:nil];

                NSLog(@"is valid json object %d",[NSJSONSerialization isValidJSONObject:jsondict]);


                [self readIn:datum];
                }
            }
             else {
                NSLog(@"no buffer!");
            }
            break;
            }


    default: {
        NSLog(@"Stream is sending an Event: %i", event);

        break;
    }
}

他のものとの唯一の違いは、最後のバイトを投げて、有効なjson辞書になったことです。私の質問に興味を持ってくれてありがとう。

于 2012-08-22T15:27:35.220 に答える
0

失敗の理由は、元のデータに「"」文字を引用する「\」文字が含まれている可能性があるためです。「Cocoa error 3840」で検索した場合、これに関するヒントが得られます。元のデータを一度に 1 文字ずつ (ASCII 形式なので UTF は必要ありません) 印刷し、これを確認します。

char *ptr = [s バイト]; for(int i=0; i<[s 長さ]; ++i) NSLog(@"%c ", *ptr++);

于 2012-08-17T11:54:45.070 に答える