从iPhone上的.Net Web服务解析JSON

时间:2014-02-19 19:28:22

标签: ios json

我调用了一个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>,但在制作中,这可以是字符串,数字,布尔值,日期等。

提前致谢!

3 个答案:

答案 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只能转换为intfloat,{{ 1}}或任何其他有效的Objective C数字格式,但除非他/她事先知道JSON的结构和数据类型,否则无法确定它是否最初是.NET BOOL

希望它有所帮助。