forked from iridia/IRWebAPIKit
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathIRWebAPIResponseParser.m
More file actions
123 lines (69 loc) · 3.07 KB
/
IRWebAPIResponseParser.m
File metadata and controls
123 lines (69 loc) · 3.07 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
//
// IRWebAPIResponseParser.m
// IRWebAPIKit
//
// Created by Evadne Wu on 1/29/11.
// Copyright 2011 Iridia Productions. All rights reserved.
//
#import "IRWebAPIResponseParser.h"
#import "JSONKit.h"
NSDictionary * IRWebAPIResponseDictionarize (id<NSObject> incomingObject);
NSDictionary * IRWebAPIResponseDictionarize (id<NSObject> incomingObject) {
if (!incomingObject)
return (id)nil;
if (![incomingObject isKindOfClass:[NSDictionary class]])
return [NSDictionary dictionaryWithObject:incomingObject forKey:@"response"];
return (id)incomingObject;
}
IRWebAPIResponseParser IRWebAPIResponseDefaultParserMake () {
// Simply tucks the returned data into a dictionary
NSDictionary * (^defaultParser) (NSData *) = ^ NSDictionary * (NSData *inData) {
return [NSDictionary dictionaryWithObjectsAndKeys:
inData, @"response",
[[NSString alloc] initWithData:inData encoding:NSUTF8StringEncoding], @"responseText",
nil];
};
return [defaultParser copy];
}
IRWebAPIResponseParser IRWebAPIResponseQueryResponseParserMake () {
// Parses UTF8 String Data Like:
//
// Key=URL_Encoded_Value
// Another_Key=Another_Encoded_Value
static IRWebAPIResponseParser parserBlock = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
parserBlock = [^ NSDictionary * (NSData *inData) {
NSString *responseString = [[NSString alloc] initWithData:inData encoding:NSUTF8StringEncoding];
NSRegularExpression *expression = [NSRegularExpression regularExpressionWithPattern:@"([^=&\n\r]+)=([^=&\n\r]+)[\n\r&]?" options:NSRegularExpressionCaseInsensitive error:nil];
NSMutableDictionary *returnedResponse = [NSMutableDictionary dictionary];
@try {
[expression enumerateMatchesInString:responseString options:0 range:NSMakeRange(0, [responseString length]) usingBlock: ^ (NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
[returnedResponse setObject:[responseString substringWithRange:[result rangeAtIndex:2]] forKey:[responseString substringWithRange:[result rangeAtIndex:1]]];
}];
} @catch (NSException * e) {
NSLog(@"IRWebAPIResponseQueryResponseParser encountered an exception while parsing response. Returning empty dictionary.");
return [NSDictionary dictionary];
}
return returnedResponse;
} copy];
});
return parserBlock;
}
IRWebAPIResponseParser IRWebAPIResponseDefaultJSONParserMake () {
static IRWebAPIResponseParser parserBlock = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
parserBlock = [^ (NSData *incomingData) {
NSError *error = nil;
// sometimes the response from cloud contains invalid utf-8 characters,
// so we deserialize it with loosely restriction
id results = [incomingData objectFromJSONDataWithParseOptions:JKParseOptionLooseUnicode error:&error];
if (error && [incomingData length] != 0) {
NSLog(@"Unable to parse JSON response, error:%@", error);
}
return IRWebAPIResponseDictionarize(results);
} copy];
});
return parserBlock;
}