web-dev-qa-db-ja.com

JSONNSDataをNSDictionaryに変換します

私はWebサービスのAPIサービスを使用していますが、その説明には、JSONデータを送信し、それから得られる応答とも一致すると書かれています。ここでは、NSURLConnection-Delegate(接続didReceiveData:(NSData *)データ)から取得し、以下を使用してNSStringに変換した部分を示します。

NSLog(@"response: %@", [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);

ここにスニペットがあります:

{"scans": 
{
    "Engine1“: 
    {
        "detected": false, 
        "version": "1.3.0.4959", 
        "result": null, 
        "update": "20140521"
    }, 
    "Engine2“: 
    {
        "detected": false,
         "version": "12.0.250.0",
         "result": null,
         "update": "20140521"
    }, 
        ...
    },
    "Engine13": 
    {
         "detected": false,
         "version": "9.178.12155",
         "result": 

NSLog-Stringでは、そこで停止します。ここで、このコード行でこのデータをJSON辞書に変換できないことの何が問題になっているのかを知りたいと思います。

NSError* error;
    NSMutableDictionary *dJSON = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:&error];

私はいくつかのオプションを試しましたが、常に同じエラーです:

Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" 
(Unexpected end of file while parsing object.) UserInfo=0x109260850 {NSDebugDescription=Unexpected end of file while parsing object.}

すべてがJSONパケットが不完全であることを示していますが、それを確認する方法や、コードにあるはずの問題を探す方法がわかりません。

8
user3191334

NSURLConnectionDelagateのすべてのデリゲートメソッドを実装しましたか。「void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data」遅延メソッドから変換用のデータを取得しているようです。その場合、不完全なデータを取得する可能性があり、それを変換することはできません。

これを試して:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
    // A response has been received, this is where we initialize the instance var you created
    // so that we can append data to it in the didReceiveData method
    // Furthermore, this method is called each time there is a redirect so reinitializing it
    // also serves to clear it
    lookServerResponseData = [[NSMutableData alloc] init];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    // Append the new data to the instance variable you declared
    [lookServerResponseData appendData:data];
}


- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    // The request is complete and data has been received
    // You can parse the stuff in your instance variable now
    NSError *errorJson=nil;
    NSDictionary* responseDict = [NSJSONSerialization JSONObjectWithData:lookServerResponseData options:kNilOptions error:&errorJson];

     NSLog(@"responseDict=%@",responseDict);

    [lookServerResponseData release];
    lookServerResponseData = nil;
}

ここで、---(lookServerResponseDataは、グローバルに宣言されたNSMutableDataのインスタンスです。

それが役立つことを願っています。

12
Rajeev