既存のウェブサイトとしてのアプリを作成しています。現在、次の形式のJSONがあります。
[
{
"id": "value",
"array": "[{\"id\" : \"value\"} , {\"id\" : \"value\"}]"
},
{
"id": "value",
"array": "[{\"id\" : \"value\"},{\"id\" : \"value\"}]"
}
]
javascriptを使用して\文字をエスケープした後に解析します。
私の問題は、次のコマンドを使用してiOSで解析するときです:
NSArray *result = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&localError];
そしてこれを行う:
NSArray *Array = [result valueForKey:@"array"];
Array
の代わりにNSMutableString
オブジェクトを取得しました。
このWebサイトはすでに実稼働中なので、適切なJSON
オブジェクトを返すために既存の構造を変更するように依頼することはできません。彼らにとっては大変な作業です。
したがって、基礎となる構造を変更するまで、iOS
でjavascript
を使用するようにwebsite
で機能させる方法はありますか?
どんな助け/提案も私にとって非常に役立つでしょう。
正しいJSONはおそらく次のようになります。
[
{
"id": "value",
"array": [{"id": "value"},{"id": "value"}]
},
{
"id": "value",
"array": [{"id": "value"},{"id": "value"}]
}
]
しかし、質問で提供されている形式にこだわっている場合は、NSJSONReadingMutableContainers
を使用して辞書を可変にし、NSJSONSerialization
エントリごとにarray
を再度呼び出す必要があります。 :
NSMutableArray *array = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
if (error)
NSLog(@"JSONObjectWithData error: %@", error);
for (NSMutableDictionary *dictionary in array)
{
NSString *arrayString = dictionary[@"array"];
if (arrayString)
{
NSData *data = [arrayString dataUsingEncoding:NSUTF8StringEncoding];
NSError *error = nil;
dictionary[@"array"] = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
if (error)
NSLog(@"JSONObjectWithData for array error: %@", error);
}
}
この簡単な方法を試してください...
- (void)simpleJsonParsing
{
//-- Make URL request with server
NSHTTPURLResponse *response = nil;
NSString *jsonUrlString = [NSString stringWithFormat:@"http://domain/url_link"];
NSURL *url = [NSURL URLWithString:[jsonUrlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
//-- Get request and response though URL
NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url];
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
//-- JSON Parsing
NSMutableArray *result = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:nil];
NSLog(@"Result = %@",result);
for (NSMutableDictionary *dic in result)
{
NSString *string = dic[@"array"];
if (string)
{
NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
dic[@"array"] = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
}
else
{
NSLog(@"Error in url response");
}
}
}
先ほど言ったように、最初にNSJSONSerialization
を使用して、JSON
をNSDictionary
またはNSArray
として使用可能なデータ構造にデシリアライズする必要があります。
ただし、JSON
のコンテンツをObjective-Cオブジェクトにマッピングする場合は、NSDictionary/NSArray
の各属性をオブジェクトプロパティにマッピングする必要があります。オブジェクトに多くの属性がある場合、これは少し苦痛かもしれません。
プロセスを自動化するには、NSObject
(個人プロジェクト)で Motis カテゴリを使用してそれを達成することをお勧めします。したがって、非常に軽量で柔軟です。 this post で使用方法を読むことができます。ただし、単に表示するために、JSON
オブジェクト属性をNSObject
サブクラスのObjective-Cオブジェクトプロパティ名にマッピングする辞書を定義する必要があります。
- (NSDictionary*)mjz_motisMapping
{
return @{@"json_attribute_key_1" : @"class_property_name_1",
@"json_attribute_key_2" : @"class_property_name_2",
...
@"json_attribute_key_N" : @"class_property_name_N",
};
}
次に、次のようにして解析を実行します。
- (void)parseTest
{
// Some JSON object
NSDictionary *jsonObject = [...];
// Creating an instance of your class
MyClass instance = [[MyClass alloc] init];
// Parsing and setting the values of the JSON object
[instance mjz_setValuesForKeysWithDictionary:jsonObject];
}
辞書からのプロパティの設定はKeyValueCoding
(KVC)を介して行われ、KVC
検証を介して設定する前に各属性を検証できます。
それがあなたを助けてくれることを願っています。
// ----------------- localfileのjson ---------------------------
NSString *pathofjson = [[NSBundle mainBundle]pathForResource:@"test1" ofType:@"json"];
NSData *dataforjson = [[NSData alloc]initWithContentsOfFile:pathofjson];
arrayforjson = [NSJSONSerialization JSONObjectWithData:dataforjson options:NSJSONReadingMutableContainers error:nil];
[tableview reloadData];
// ------------- urlfileのjson -------------------------------- ---
NSString *urlstrng = @"http://www.json-generator.com/api/json/get/ctILPMfuPS?indent=4";
NSURL *urlname = [NSURL URLWithString:urlstrng];
NSURLRequest *rqsturl = [NSURLRequest requestWithURL:urlname];
// ------------非同期によるurlfileのjson ----------------------
[NSURLConnection sendAsynchronousRequest:rqsturl queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {
arrayforjson = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
[tableview reloadData];
}];
// -------------同期によるurlfileのjson ----------------------
NSError *error;
NSData *data = [NSURLConnection sendSynchronousRequest:rqsturl returningResponse:nil error:&error];
arrayforjson = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
[tableview reloadData];
} ;
//-------------- get data url--------
NSURLRequest *request=[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://echo.jsontest.com/key/value"]];
NSData *data=[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
NSLog(@"response==%@",response);
NSLog(@"error==%@",Error);
NSError *error;
id jsonobject=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
if ([jsonobject isKindOfClass:[NSDictionary class]]) {
NSDictionary *dict=(NSDictionary *)jsonobject;
NSLog(@"dict==%@",dict);
}
else
{
NSArray *array=(NSArray *)jsonobject;
NSLog(@"array==%@",array);
}
jsonData
に配信する前に、常にNSJSONSerialization
をエスケープ解除できます。または、取得した文字列を使用して、別のjson object
を取得してarray
を取得します。
NSJSONSerialization
は正しく動作しています。例の値は文字列でなければなりません。
NSError *err;
NSURL *url=[NSURL URLWithString:@"your url"];
NSURLRequest *req=[NSURLRequest requestWithURL:url];
NSData *data = [NSURLConnection sendSynchronousRequest:req returningResponse:nil error:&err];
NSDictionary *json=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSArray * serverData=[[NSArray alloc]init];
serverData=[json valueForKeyPath:@"result"];
別の答えが言ったように、その値は文字列です。
有効なjson文字列であると思われる文字列をデータに変換し、そのjsonデータオブジェクトを解析して、キーの値として辞書に追加できる配列に戻します。
これが役に立つかもしれません。
- (void)jsonMethod
{
NSMutableArray *idArray = [[NSMutableArray alloc]init];
NSMutableArray *nameArray = [[NSMutableArray alloc]init];
NSMutableArray* descriptionArray = [[NSMutableArray alloc]init];
NSHTTPURLResponse *response = nil;
NSString *jsonUrlString = [NSString stringWithFormat:@"Enter your URL"];
NSURL *url = [NSURL URLWithString:[jsonUrlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url];
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:nil];
NSDictionary *result = [NSJSONSerialization JSONObjectWithData:responseData options:NSJSONReadingMutableContainers error:nil];
NSLog(@"Result = %@",result);
for (NSDictionary *dic in [result valueForKey:@"date"])
{
[idArray addObject:[dic valueForKey:@"key"]];
[nameArray addObject:[dic valueForKey:@"key"]];
[descriptionArray addObject:[dic valueForKey:@"key"]];
}
}
NSString *post=[[NSString stringWithFormat:@"command=%@&username=%@&password=%@",@"login",@"username",@"password"]stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSMutableURLRequest *request=[NSMutableURLRequest requestWithURL:[NSURL URLWithString:@"http://www.blablabla.com"]];
[request setHTTPMethod:@"POST"];
[request setValue:@"x-www-form-urlencoded" forHTTPHeaderField:@"content-type"];
[request setHTTPBody:[NSData dataWithBytes:[post UTF8String] length:strlen([post UTF8String])]];
NSData *data=[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
id jsonobject=[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
if ([jsonobject isKindOfClass:[NSDictionary class]])
{
NSDictionary *dict=(NSDictionary *)jsonobject;
NSLog(@"dict==%@",dict);
}
else
{
NSArray *array=(NSArray *)jsonobject;
NSLog(@"array==%@",array);
}
JSONのデフォルトメソッド:
+ (NSDictionary *)stringWithUrl:(NSURL *)url postData:(NSData *)postData httpMethod:(NSString *)method
{
NSDictionary *returnResponse=[[NSDictionary alloc]init];
@try
{
NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:url
cachePolicy:NSURLRequestReloadIgnoringCacheData
timeoutInterval:180];
[urlRequest setHTTPMethod:method];
if(postData != nil)
{
[urlRequest setHTTPBody:postData];
}
[urlRequest setValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[urlRequest setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[urlRequest setValue:@"text/html" forHTTPHeaderField:@"Accept"];
NSData *urlData;
NSURLResponse *response;
NSError *error;
urlData = [NSURLConnection sendSynchronousRequest:urlRequest
returningResponse:&response
error:&error];
returnResponse = [NSJSONSerialization
JSONObjectWithData:urlData
options:kNilOptions
error:&error];
}
@catch (NSException *exception)
{
returnResponse=nil;
}
@finally
{
return returnResponse;
}
}
返却方法:
+(NSDictionary *)methodName:(NSString*)string{
NSDictionary *returnResponse;
NSData *postData = [NSData dataWithBytes:[string UTF8String] length:[string length]];
NSString *urlString = @"https//:..url....";
returnResponse=[self stringWithUrl:[NSURL URLWithString:urlString] postData:postData httpMethod:@"POST"];
return returnResponse;
}
#define FAVORITE_BIKE @"user_id=%@&bike_id=%@"
@define FAVORITE_BIKE @"{\"user_id\":\"%@\",\"bike_id\":\"%@\"}"
NSString *urlString = [NSString stringWithFormat:@"url here"];
NSString *jsonString = [NSString stringWithFormat:FAVORITE_BIKE,user_id,_idStr];
NSData *myJSONData =[jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:urlString]];
[request setHTTPMethod:@"POST"];
NSMutableData *body = [NSMutableData data];
[body appendData:[NSData dataWithData:myJSONData]];
[request setHTTPBody:body];
NSError *error;
NSURLResponse *response;
NSData *urlData=[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];
NSString *str = [[NSString alloc]initWithData:urlData encoding:NSUTF8StringEncoding];
if(str.length > 0)
{
NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];
NSMutableDictionary *resDict =[NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingAllowFragments error:nil];
}
@property NSMutableURLRequest * urlReq;
@property NSURLSession *セッション;
@property NSURLSessionDataTask * dataTask;
@property NSURLSessionConfiguration * sessionConfig;
@property NSMutableDictionary * appData;
@property NSMutableArray * valueArray; @property NSMutableArray * keysArray;
-(void)getData
{self.urlReq = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:self.linkString]];
self.sessionConfig = [NSURLSessionConfiguration defaultSessionConfiguration];
self.session = [NSURLSession sessionWithConfiguration:self.sessionConfig];
self.dataTask = [self.session dataTaskWithRequest:self.urlReq completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
self.appData = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSLog(@"%@",self.appData);
self.valueArray=[self.appData allValues];
self.keysArray = [self.appData allKeys];
}];
[self.dataTask resume];