我调用了一个Web服务,我从中恢复了JSON。现在JSON是用户定义的,因此每个用户可以有所不同。问题是,我如何在iOS中检查它的价值是什么? (NSString,BOOL,NSNumber,NSDate等?)
我收到的示例JSON(已经进入NSArray):
<__NSArrayM 0x119d11040>(
0000000010,
SomeName,
1, <--- boolean
SomeText,
3133,
<null>,
<null>,
<null>,
<null>,
0,
/Date(1321536126810)/,
System\ABC,
<null>,
<null>
)
(这是一个演示环境,所以很多值都是<null>
,但在制作中,这可以是字符串,数字,布尔值,日期等。
提前致谢!
答案 0 :(得分:0)
尝试执行以下操作来记录[object class];
:NSLog(@"%@", NSStringFromClass(object.class));
如果您正在研究解析JSON,请尝试使用NSJSONSerialization
。请参阅:https://developer.apple.com/library/ios/documentation/foundation/reference/nsjsonserialization_class/Reference/Reference.html
答案 1 :(得分:0)
对于Date,我有一个Utilities类,它有一些简单的方法来处理来自.NET的SQL日期。这是从JSON日期开始生成NSDate对象的那个:
+ (NSDate *)nsDateFromDotNetJSONString:(id)object {
if ([object isKindOfClass:[NSDate class]]) {
return (NSDate *)object;
}
if (![object isKindOfClass:[NSString class]]) {
return nil;
}
NSString *string = (NSString *)object;
static NSRegularExpression *dateRegEx = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
dateRegEx = [[NSRegularExpression alloc] initWithPattern:@"^\\/date\\((-?\\d++)(?:([+-])(\\d{2})(\\d{2}))?\\)\\/$" options:NSRegularExpressionCaseInsensitive error:nil];
});
NSTextCheckingResult *regexResult = [dateRegEx firstMatchInString:string options:0 range:NSMakeRange(0, [string length])];
if (regexResult) {
// milliseconds
NSTimeInterval seconds = [[string substringWithRange:[regexResult rangeAtIndex:1]] doubleValue] / 1000.0;
// timezone offset
if ([regexResult rangeAtIndex:2].location != NSNotFound) {
NSString *sign = [string substringWithRange:[regexResult rangeAtIndex:2]];
// hours
seconds += [[NSString stringWithFormat:@"%@%@", sign, [string substringWithRange:[regexResult rangeAtIndex:3]]] doubleValue] * 60.0 * 60.0;
// minutes
seconds += [[NSString stringWithFormat:@"%@%@", sign, [string substringWithRange:[regexResult rangeAtIndex:4]]] doubleValue] * 60.0;
}
return [NSDate dateWithTimeIntervalSince1970:seconds];
}
return nil;
}
这是我用来获取SQL的NSDate和格式的一个:
+(NSString *)sqlDateStringFromNSDate:(NSDate *)date {
if (date == nil) {
return @"";
}
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd hh:mm:ss"];
return [dateFormatter stringFromDate:date];
}
如果您需要更多帮助,请与我们联系。
答案 2 :(得分:0)
如果您以有效格式从服务器收到JSON,则可以使用NSJSONSerialization
类将其序列化为某些字典/数组,具体取决于JSON中设置的容器类型。序列化过程不仅会为您生成一个有效的容器(NSArray
/ NSDictionary
),而且还会根据JSON本身中的类型分配包含的值,例如,引用的值将是包含为NSString
,数字将包含为NSNumber
,空值将包含为NSNull
实例等。下面是一个简单的代码行,可将有效的JSON转换为等效的Objective C容器类型,假设message
是从服务器发送的JSON的NSString
表示:
[NSJSONSerialization JSONObjectWithData:[message dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableContainers error:NULL];
但是,在.NET Web服务的情况下,日期将作为前缀为/Date
的字符串,并且序列化过程将假定为NSString
。因此,要在JSON中查找日期,您将遍历解析后的Objective-C数组/字典(可能使用for in
循环)获取“/ Date”前缀,然后手动将其转换为NSDate
。这段简单的代码可以帮到你:
if ([[str lowercaseString] hasPrefix:@"/date"]) { //str is a value in the parsed container with prefix /Date so assume that as date rather than a string
NSTimeInterval interval = [[NSNumber numberWithLongLong:[[[str stringByReplacingOccurrencesOfString:@"/date(" withString:@""] stringByReplacingOccurrencesOfString:@")/" withString:@""] longLongValue]] doubleValue] / 1000.0;
NSDate* dt = [NSDate dateWithTimeIntervalSince1970:interval];
//do whatever with dt now
}
最后,对于.NET数据类型,.NET null
被解析为[NSNull null]
而不是nil
人们可能期望的。因此,当您在迭代时在容器中找到nil
时,您应该假设[NSNull null]
。此外,.NET bool
数据类型将被解析为0/1,而NSNumber
只能转换为int
,float
,{{ 1}}或任何其他有效的Objective C数字格式,但除非他/她事先知道JSON的结构和数据类型,否则无法确定它是否最初是.NET BOOL
。
希望它有所帮助。