有关JSON解析的相关问题

1.post和get都可以用来上传/下载信息,具体使用方法完全取决于服务器给的接口,所传信息在参数上而不是json中。
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
.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


评论

此博客中的热门博文

使__attribute__((annotate("xxx")))能作用于OC函数

viewWillAppear不执行的解决办法

iOS中使用xpc/xpc.h