有关JSON解析的相关问题
1.post和get都可以用来上传/下载信息,具体使用方法完全取决于服务器给的接口,所传信息在参数上而不是json中。
2.json的解析数据中,花括号要用相应的model(对象)来接,键值要用model中的属性(property)来接。
3.目前常用的就是AFNetworking,下附相关AFNetworking封装。
2.json的解析数据中,花括号要用相应的model(对象)来接,键值要用model中的属性(property)来接。
3.目前常用的就是AFNetworking,下附相关AFNetworking封装。
.h:
#import
#import "AFNetworking.h"
@interface YuNetworking : NSObject
//检测网络状态
+ (void)netWorkingStatus;
/**
* Get 请求 JSON
*
* @param urlStr URL 名称
* @param params 数据字典
* @param success 请求成功返回值
* @param fail 请求失败返回值
*/
+ (void)Yu_GET_JSONDataWithUrl:(NSString *)urlStr Params:(NSDictionary*)params success:(void (^)(id json))success fail:(void (^)())fail;
/**
* POST 请求 JSON
* @param urlStr URL 名称
* @param parameters 数据字典 (建议可变字典)
* @param success 请求成功返回的参数
* @param fail 请求失败返回的参数
*/
+ (void)Yu_Post_JSONWithUrl:(NSString *)urlStr parameters:(NSDictionary *)parameters success:(void (^)(id json))success fail:(void (^)())fail;
/**
* post 上传文件! 图片
*
* @param urlStr URL 链接名/ 宏拼接
* @param params 除了文件以外需要上传的数据
* @param data_arr 图片数组 此数组只保存 data 格式的元素
* @param success 请求成功返回值
* @param fail 请求失败返回值
*/
+ (void)Yu_Post_UploadWithUrl:(NSString *)urlStr Params:(NSDictionary*)params Data_arr:(NSArray*)data_arr success:(void (^)(id responseObject))success fail:(void (^)())fail;
/**
要使用常规的AFN网络访问
1. AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
所有的网络请求,均有manager发起
2. 需要注意的是,默认提交请求的数据是二进制的,返回格式是JSON
1> 如果提交数据是JSON的,需要将请求格式设置为AFJSONRequestSerializer
2> 如果返回格式不是JSON的,
3. 请求格式
AFHTTPRequestSerializer 二进制格式
AFJSONRequestSerializer JSON
AFPropertyListRequestSerializer PList(是一种特殊的XML,解析起来相对容易)
4. 返回格式
AFHTTPResponseSerializer 二进制格式
AFJSONResponseSerializer JSON
AFXMLParserResponseSerializer XML,只能返回XMLParser,还需要自己通过代理方法解析
AFXMLDocumentResponseSerializer (Mac OS X)
AFPropertyListResponseSerializer PList
AFImageResponseSerializer Image
AFCompoundResponseSerializer 组合
*/
@end
@end
.m
#import "YuNetworking.h"
#import "GiFHUD.h"
@implementation YuNetworking
#pragma mark - 检测网络状态
+ (void)netWorkingStatus
{
/**
AFNetworkReachabilityStatusUnknown = -1, // 未知
AFNetworkReachabilityStatusNotReachable = 0, // 无连接
AFNetworkReachabilityStatusReachableViaWWAN = 1, // 3G 花钱
AFNetworkReachabilityStatusReachableViaWiFi = 2, // WiFi
*/
//如果要检测网络状态变化,必须用检测管理器的单例的startMonitoring
[[AFNetworkReachabilityManager sharedManager] startMonitoring];
//监测网络连接的单例,网络变化时的回调方法
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
NSLog(@"%ld", (long)status);
}];
}
#pragma mark-JSON方式获取数据Get
+ (void)Yu_GET_JSONDataWithUrl:(NSString *)urlStr Params:(NSDictionary*)params success:(void (^)(id json))success fail:(void (^)())fail
{
//加载动画
// [GiFHUD setGifWithImageName:@"loading.gif"];
// [GiFHUD showWithOverlay];
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
//设置请求格式
manager.requestSerializer = [AFJSONRequestSerializer serializer];
NSString *url = [NSString stringWithFormat:@"%@",urlStr];
NSLog(@"param == %@", params);
//网络访问是异步的,回调主线程,因此不用管在主线程更新UI的事情
[manager GET:url parameters:params success:^(AFHTTPRequestOperation *operation, id responseObject) {
if (success) {
success(responseObject);
//去掉加载动画
// [GiFHUD dismiss];
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"%@", error);
if (fail) {
fail();
//去掉加载动画
// [GiFHUD dismiss];
}
}];
}
#pragma mark- JSON方式post数据
+ (void)Yu_Post_JSONWithUrl:(NSString *)urlStr parameters:(NSDictionary *)parameters success:(void (^)(id json))success fail:(void (^)())fail
{
//加载动画
// [GiFHUD setGifWithImageName:@"loading.gif"];
// [GiFHUD showWithOverlay];
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
// 设置请求格式
manager.requestSerializer = [AFJSONRequestSerializer serializer];
NSString* url = [NSString stringWithFormat:@"%@",urlStr];
// NSLog(@"url = %@",url);
// NSLog(@"parames = %@",parameters);
[manager POST:url parameters:parameters constructingBodyWithBlock:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
if (success) {
success(responseObject);
//去掉 菊花加载动画
// [GiFHUD dismiss];
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"错误 %@", error.localizedDescription);
if (fail) {
fail();
//去掉 菊花加载动画
// [GiFHUD dismiss];
}
}];
}
/**
*文件上传,文件名由服务器端决定 适合传多张图片
*urlStr: 需要上传的服务器url
*Idcard_front_Data: 需要上传的本地文件data
*Idcard_front_fileName: 需要上传文件名以及扩展名
*/
+ (void)Yu_Post_UploadWithUrl:(NSString *)urlStr
Params:(NSDictionary*)params
Data_arr:(NSArray*)data_arr
success:(void (^)(id responseObject))success
fail:(void (^)())fail
{
//加载动画
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
manager.requestSerializer = [AFJSONRequestSerializer serializer];
NSString* url = [NSString stringWithFormat:@"%@",urlStr];
[manager POST:url parameters:params constructingBodyWithBlock:^(id formData) {
for (int i = 0; i < data_arr.count; i++) {
NSDictionary *picDic = [data_arr objectAtIndex:i];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setTimeZone:[NSTimeZone systemTimeZone]];
[formatter setDateFormat:@"yyyyMMddHHmmss"];
NSString* dateString = [formatter stringFromDate:[NSDate date]];
dateString = [NSString stringWithFormat:@"%@_%ld.png",dateString,data_arr.count + 1];
NSData* data = [NSData data];
data = [picDic objectForKey:@"picData"];
NSString *path = NSHomeDirectory();
NSLog(@"path:%@",path);
NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString* documentsDirectory = [paths objectAtIndex:0];
NSString* fullPathToFile = [documentsDirectory stringByAppendingPathComponent:dateString];
[data writeToFile:fullPathToFile atomically:NO];
NSString* name = [picDic objectForKey:@"picKey"];
[formData appendPartWithFileData:data name:name fileName:dateString mimeType:@"image/png"];
}
} success:^(AFHTTPRequestOperation *operation, id responseObject) {
if (success) {
success(responseObject);
//去掉 菊花加载动画
}
} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
NSLog(@"错误 %@", error.localizedDescription);
if (fail) {
fail();
//去掉 菊花加载动画
}
}];
}
@end
评论
发表评论