2014-12-08 11 views
0

Я новичок прошивки, я был в состоянии написать NSDictionary объектов в файл, как показано ниже, напримерКак разобрать объекты NSJsonDictionary в JSon файл с помощью SBJson4StreamParser

{ 
"msg":"Hello", 
"from":"X", 
"date":"12/1/2014" 
} 
{ 
"msg":"new to IOS", 
"from":"home", 
"date":"23/2/2014" 
} 

Я знаю, что это массив объектов, мне нужно чтобы использовать NSArray, но я предотвратил, так как мой единственный объект NSDictionary потребляет много памяти, я хотел сериализовать и десериализовать один объект за раз. Я столкнулся с SBJson4StreamParser, внутренне выполняет такую ​​функциональность, но у меня возникли проблемы с реализацией, я также попытался использовать родной NSJsonSeriailzation, но параметры были ограничены для такого типа синтаксического анализа, может ли кто-нибудь помочь с этим.

+0

Возможный дубликат [Возможно ли разбирать NSInputStream с помощью SBJson4?] (Http://stackoverflow.com/questions/23434401/is-it-possible-to-parse-an-nsinputstream-using-sbjson4) Конечно [мой ответ в этом потоке тоже будет работать здесь] (http://stackoverflow.com/a/27330264/5950). –

+0

Вышеупомянутый не является массивом объектов, это недействительный JSON, состоящий из двух объектов, написанных обратным связыванием без какого-либо другого структурирования JSON. –

+0

@HotLicks SBJson v3 и 4 могут анализировать потоки таких документов и вызывать метод делегата (или блокировать в v4) каждый раз, когда он разбирает полный документ. –

ответ

0

SBJson может помочь здесь, читая файл chunkwise с NSInputStream и подачей его в синтаксический анализатор, как это:

id parser = [SBJson4Parser multiRootParserWithBlock:block 
             errorHandler:eh]; 

id is = [NSInputStream inputStreamWithFileAtPath:filePath]; 
[is open]; 

// Buffer to read from the input stream 
uint8_t buf[1024]; 

// Read from input stream until empty, or an error; 
// better error handling is left as an exercise for the reader 
while (0 > [is read:buffer maxLength: sizeof buffer]) { 
    SBJson4ParserStatus status = [parser parse:data]; 
    NSLog(@"Status: %u",status); 
    // Handle parser errors here 
} 
[is close]; 

Обратите внимание, что вам все равно придется читать и анализировать весь файл, чтобы гарантировать , что вы найдите конкретную запись. Невозможно обработать только нулевую запись .

0

Я хотел бы предложить еще одну возможность: давайте предположим, что есть сообщения вашего NSArray словарного объекта, то вы можете сериализовать:

[[NSUserDefaults standardUserDefaults] setObject:self.messages forKey:@"com.yourdomain.messages"]; 
[[NSUserDefaults standardUserDefaults] synchronize]; 

и десериализации

self.messages = [[NSUserDefaults standardUserDefaults] arrayForKey:@"com.yourdomain.messages"]; 

Ссылки: Apple doc

I надеюсь, это может вам помочь.