Я звоню в стороннюю службу JSON
NSString* urlString = [NSString stringWithFormat:BASE_JSON_URL, address];
NSURL* urlAddressJSonUrl = [NSURL URLWithString:urlString];
dispatch_async(globalQueue,
^{
NSData* addressData = [NSData dataWithContentsOfURL:urlAddressJSonUrl];
[self performSelectorOnMainThread:@selector(resolveFromJSonResult:)
withObject:addressData waitUntilDone:YES];
});
скопируйте и вставьте urlString в браузер, получив статус ok, и я получу свой объект JSON в качестве словаря. Преобразование NSData
приводит к NSDictionary
следующим образом: nil
NSDictionary* jsonAddressResult = [NSJSONSerialization JSONObjectWithData:jsonResponseData options:NSJSONReadingAllowFragments error:&error];
также попытался в параметрах options
: kNilOptions
и NSJSONReadingMutableContainers |NSJSONReadingAllowFragments
но я все равно получил NSJSONReadingMutableContainers |NSJSONReadingAllowFragments
.
преобразование NSData
в NSString
оскорбило, что результатом является HTML:
(null)<style>body{color:#black;} span.q{color:#FF0084;} span.ns{color:#0259C4; font-weight:bold;} span.n{color:#666666;} span.at{font-weight:bold;}</style><pre>{ "<span class="ns">places</span>": {
"<span class="ns">place</span>": [
{ "<span class="at">place_id</span>": "<span class="q">RaZZuVZQW7xqJM2P</span>", "<span class="at">woeid</span>": "<span class="q">1968212</span>", "<span class="at">latitude</span>": <span class="n">32.045</span>, "<span class="at">longitude</span>": <span class="n">34.769</span>, "<span class="at">place_url</span>": "<span class="q">\/Spain\/Tel+Aviv\/Tel+Aviv</span>", "<span class="at">place_type</span>": "<span class="q">locality</span>", "<span class="at">place_type_id</span>": <span class="n">7</span>, "<span class="at">timezone</span>": "<span class="q">Asia\/Jerusalem</span>", "<span class="at">_content</span>": "<span class="q">Madrid, Madrid, Spain</span>", "<span class="at">woe_name</span>": "<span class="q">Madrid</span>" }
], "<span class="at">query</span>": "<span class="q">Madrid, Spain</span>", "<span class="at">total</span>": <span class="n">1</span> }, "<span class="at">stat</span>": "<span class="q">ok</span>" }</pre>
как я могу преобразовать это в JSON или лучше, но вытащить нужные мне данные?
во-первых, вы всегда должны иметь четкое представление о том, какие именно данные, возвращаемые ресурсом REST (т.е. скорее, чем пробная версия и ошибка, как то, что вы делаете), используя такие инструменты, как почтальон, вы получаете заголовок content-type
ответа:
используя эту информацию и используя AFNetworking (что значительно облегчает выполнение таких задач), вы можете зарегистрировать свой тип ответа так:
AFHTTPClient *client =
[[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:kApiBaseUrl]];
// notice that request parameter encoding may very well be of type json, that
// not the same as the return header being json or html etc
client.parameterEncoding = AFJSONParameterEncoding;
// here you are setting the return header as 'text/html' b/c that what
// exactly what it is, if postman said it was of type 'application/json'
// then you'd put that here
[client setDefaultHeader:@"Accept" value:@"text/html"];
то вы можете опубликовать или сделать так:
NSString *postPath = @"your api resource path";
NSDictionary *params = @{@"param1name": param1value,
@"param2name": param2value}; // your request params
[client postpath:postPath parameters:params
success:^(AFHTTPRequestOperation *operation, id JSON){
// here you convert the JSON into an array like structure
id payload = [NSJSONSerialization JSONObjectWithData:JSON
options:NSJSONReadingAllowFragments
error:nil];
// process payload
NSString *fname = payload[@"fname"]; //etc
}failure:^(AFHTTPRequestOperation *operation, NSError *error){
// handle error
}
Я рекомендую вам прочитать в документах JSONObjectWithData: options: error: особенно часть параметров.