9

NSJSONSerialization'sを使用してJSONObjectWithData:data options: error:、サーバーから返されたJSONデータを解析します。

ここで、私が使用するオプションパラメータについて:NSJSONReadingAllowFragments。以下を見て、実際のJSONを確認できます(問題があると私は信じています)。

私が受け取るエラーメッセージは次のとおりです。

Error Domain = NSCocoaErrorDomain Code = 3840 "操作を完了できませんでした。(Cocoaエラー3840。)"(文字0の周りの値が無効です。)UserInfo = 0x6895da0{NSDebugDescription=文字0の周りの値が無効です。}

それを修正する方法はありますか?

JSON =

{"name":"Johan Appleseed",
"email":"j.appleseed@emuze.co",
"phone":"+4121876003",
"accounts":{
    "facebook":[true,1125],
    "twitter":[false,null],
    "homepage":[true,"http:\/\/johnAplleseed.com\/index.html"]}}
4

6 に答える 6

12

おそらくあなたはあなたが見ることができないいくつかの印刷できない文字を持っています。これを試して:

NSData *jsonData = ...
const unsigned char *ptr = [data bytes];

for(int i=0; i<[data length]; ++i) {
  unsigned char c = *ptr++;
  NSLog(@"char=%c hex=%x", c, c);
}

データの最初または最後に印刷できない文字がないことを確認します。

編集:明確にするために、JSON辞書(解析に失敗した辞書)で上記を実行するだけです。

于 2012-08-22T11:21:36.870 に答える
2

私は実際に問題を発見しました。URLからの戻り値がHTMLページであり、実際の応答の周りにこれらすべてのhtml、head、およびbodyタグがあるため、解析できません。これは、応答からHTMLタグを削除する方法に関する優れたQ&Aです(文字列に変更された後):iPhoneのNSStringからHTMLタグを削除します

于 2012-08-25T08:46:31.150 に答える
1

しばらく同じ問題が発生しました。たとえば、PHPページなどのWebページからデータを取得する場合、そのページにHTMLタグを含めるべきではないことがわかりました。したがって、次のような構造です。

<html>
<body>
<?php

?>
</body>
</html>

結果を台無しにします。それをに変える:

<?php

?> 

私のために働いた。

于 2014-03-24T05:45:10.967 に答える
0

しばらく経ちましたが、データを印刷する簡単な方法は次のとおりです。

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

于 2013-11-12T22:59:55.567 に答える
0

1つの方法はそこにあります、あなたはポストリクエストによってjsondataを解析することができます

 -(void)callWebserviceList
 {
spinner.hidden=NO;

NSString *bodyData = @"code_request=monuments_list&asi_id=1";

NSMutableURLRequest *postRequest = [NSMutableURLRequest requestWithURL:[NSURL   URLWithString:@"http://asicircles.com/server_sync.php"]];

// Set the request's content type to application/x-www-form-urlencoded
[postRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

// Designate the request a POST request and specify its body data
[postRequest setHTTPMethod:@"POST"];
[postRequest setHTTPBody:[NSData dataWithBytes:[bodyData UTF8String] length:strlen([bodyData UTF8String])]];

connection1 = [NSURLConnection connectionWithRequest:postRequestデリゲート:自己];

if(connection1 !=nil)
{
    ////NSLog(@"%@",postRequest);
}

}

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {

if ([connection isEqual:connection1 ])
{
     [responseData setLength:0];

}else if ([connection isEqual:connection2 ])
{
     [responseData1 setLength:0];
}

}-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {

    if ([connection isEqual:connection1 ])
  {
    [responseData appendData:data];

}else if ([connection isEqual:connection2 ])
{
     [responseData1 appendData:data];
}


//**check here for responseData & also data**

}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
NSLog(@"%@",[NSString stringWithFormat:@"Connection failed: %@", [error description]]);
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
if ([connection isEqual:connection1 ])
{
    spinner.hidden=YES;
    NSError *error;

    NSDictionary* json = [NSJSONSerialization JSONObjectWithData:responseData options:kNilOptions error:&error];

    NSMutableArray *arrdata=[json objectForKey:@"message"];
    NSLog(@"code is%@", json);

    for (int i=0; i< arrdata.count; i++)
    {
        [arrDetails addObject:[[arrdata objectAtIndex:i]objectForKey:@"details"]];
        [arrImageUrl addObject:[[arrdata objectAtIndex:i]objectForKey:@"image"]];
        [arrLat addObject:[[arrdata objectAtIndex:i]objectForKey:@"lat"]];
        [arrLongi addObject:[[arrdata objectAtIndex:i]objectForKey:@"longi"]];
        [arrName addObject:[[arrdata objectAtIndex:i]objectForKey:@"name"]];
        [arrLoc addObject:[[arrdata objectAtIndex:i]objectForKey:@"location"]];
        [arrID addObject:[[arrdata objectAtIndex:i]objectForKey:@"id"]];

        NSLog(@"code is%@",[[arrdata objectAtIndex:i]objectForKey:@"details"]);
        NSLog(@"code is%@",[arrImageUrl objectAtIndex:i]);

    }



    if (arrName.count > 0)
    {
        [self addscrollView];
    }



}else if ([connection isEqual:connection2 ])
{

}


}
于 2014-02-05T06:08:02.300 に答える
0

iOSのブロックごとにjsonデータのURLを押すこともできます

 #define kBgQueue dispatch_get_global_queue(
 DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) //1
#define kLatestKivaLoansURL [NSURL URLWithString: 
 @"http://api.kivaws.org/v1/loans/search.json?status=fundraising"] //2

最初に行う必要があるのは、WebからJSONデータをダウンロードすることです。幸い、GCDを使用すると、1行のコードでこれを実行できます。ViewController.mに以下を追加します。

- (void)viewDidLoad
{
[super viewDidLoad];

dispatch_async(kBgQueue, ^{
    NSData* data = [NSData dataWithContentsOfURL: 
      kLatestKivaLoansURL];
    [self performSelectorOnMainThread:@selector(fetchedData:) 
      withObject:data waitUntilDone:YES];
});
}
- (void)fetchedData:(NSData *)responseData {
//parse out the json data
NSError* error;
NSDictionary* json = [NSJSONSerialization 
    JSONObjectWithData:responseData //1

    options:kNilOptions 
    error:&error];

NSArray* latestLoans = [json objectForKey:@"loans"]; //2

NSLog(@"loans: %@", latestLoans); //3
}
于 2014-02-05T06:18:36.403 に答える