Парсинг дат JSON на iPhone

Можно добраться путем присоединения на номер строки . Это возможно, потому что, так как это - идентификационные данные, это просто увеличит, поскольку Вы добавляете объекты, которые будут в порядке, что Вы выбираете их.

36
задан Anupdas 15 June 2013 в 07:20
поделиться

3 ответа

Как .NET-программист, изучающий Objective-C, у меня была та же проблема, когда я пытался использовать .Net WebService.

Сначала я думал, что смогу использовать NSDateFormatter. .. Я нашел действительно хорошую ссылку на его символы здесь , но я быстро понял, что мне нужно преобразовать число из миллисекунд в секунды.

Я написал код для этого ... Я все еще изучаю Obj-C, но не думаю, что это должно было быть так сложно ...

- (NSDate *) getJSONDate{
    NSString* header = @"/Date(";
    uint headerLength = [header length];

    NSString*  timestampString;

    NSScanner* scanner = [[NSScanner alloc] initWithString:self];
    [scanner setScanLocation:headerLength];
    [scanner scanUpToString:@")" intoString:&timestampString];

    NSCharacterSet* timezoneDelimiter = [NSCharacterSet characterSetWithCharactersInString:@"+-"];
    NSRange rangeOfTimezoneSymbol = [timestampString rangeOfCharacterFromSet:timezoneDelimiter];

    [scanner dealloc];

    if (rangeOfTimezoneSymbol.length!=0) {
        scanner = [[NSScanner alloc] initWithString:timestampString];

        NSRange rangeOfFirstNumber;
        rangeOfFirstNumber.location = 0;
        rangeOfFirstNumber.length = rangeOfTimezoneSymbol.location;

        NSRange rangeOfSecondNumber;
        rangeOfSecondNumber.location = rangeOfTimezoneSymbol.location + 1;
        rangeOfSecondNumber.length = [timestampString length] - rangeOfSecondNumber.location;

        NSString* firstNumberString = [timestampString substringWithRange:rangeOfFirstNumber];
        NSString* secondNumberString = [timestampString substringWithRange:rangeOfSecondNumber];

        unsigned long long firstNumber = [firstNumberString longLongValue];
        uint secondNumber = [secondNumberString intValue];

         NSTimeInterval interval = firstNumber/1000;

        return [NSDate dateWithTimeIntervalSince1970:interval];
    }

    unsigned long long firstNumber = [timestampString longLongValue];
    NSTimeInterval interval = firstNumber/1000;

    return [NSDate dateWithTimeIntervalSince1970:interval];
}

Надеюсь, кто-нибудь сможет предоставить лучшее решение Obj-C. Если нет, я могу оставить это или поищу способ изменить формат сериализации в .NET

РЕДАКТИРОВАТЬ:

Об этом формате JSON DateTime ... Если у вас есть какой-либо контроль над службой, вероятно, лучше всего будет преобразовать дату в строку в ваших объектах DataContract.

Форматирование в RFC1123 сейчас кажется мне хорошей идеей. Поскольку я, вероятно, легко могу подобрать его с помощью NSDateFormatter.

Цитата из Рика Стрела

Там нет литерала даты в JavaScript, и Microsoft разработала собственный формат даты, который по сути является размеченной строкой. Формат представляет собой закодированную строку, содержащую стандартное новое значение даты (миллисекунды с 1970 года).

9
ответ дан 27 November 2019 в 05:28
поделиться
0
ответ дан 27 November 2019 в 05:28
поделиться

Я был в той же лодке, когда использовал json-framework, который не поддерживает формат даты, поскольку это не официальный JSON. Мой источник взят из API, созданного с использованием JSON.Net. Вот что я придумал:

- (NSDate*) getDateFromJSON:(NSString *)dateString
{
    // Expect date in this format "/Date(1268123281843)/"
    int startPos = [dateString rangeOfString:@"("].location+1;
    int endPos = [dateString rangeOfString:@")"].location;
    NSRange range = NSMakeRange(startPos,endPos-startPos);
    unsigned long long milliseconds = [[dateString substringWithRange:range] longLongValue];
    NSLog(@"%llu",milliseconds);
    NSTimeInterval interval = milliseconds/1000;
    return [NSDate dateWithTimeIntervalSince1970:interval];
}

У меня нет добавленной части в формате даты, который вы делаете, поэтому я не занимался этим, как ответ выше. Никаких ошибок не обнаружено, на данный момент для меня это все в новинку.

18
ответ дан 27 November 2019 в 05:28
поделиться