Я не знаю каких-либо конкретных реализаций, но кодирование значения ключа приближает вас к тому, что вы хотите: Руководство по кодированию значения ключа . Я добился хороших результатов, сочетая потоковый анализ JSON с KVC.
Метод -setValue: forKey: делает адаптацию сериализованных данных к пользовательским объектам довольно простой. Чтобы продолжить работу с примером, вы должны создать класс Unicorn со всеми необходимыми методами доступа: -setName: / - name, -setManeColor / -maneColor и т. Д. (Вы можете использовать свойства для некоторых ожидаемых значений, но есть случаи, как со значением maneColor, когда вы, вероятно, захотите написать собственный установщик для преобразования из строки имени цвета в объект NSColor или UIColor.)
Вы также захотите добавить еще два метода в свой пользовательский объект: -setValue: forUndefinedKey: и -valueForUndefinedKey :. Это методы, которые будут вызываться, если у вашего объекта нет методов доступа, соответствующих ключу, переданному в методы KVC. Здесь вы можете перехватывать неожиданные или неподдерживаемые значения и сохранять их или игнорировать их при необходимости.
Когда вы отправляете -setValue: forKey: объекту Unicorn, каркас ищет средства доступа, соответствующие шаблону ключа. Например, если ключ «maneColor» и вы устанавливаете значение, платформа проверяет, реализует ли ваш объект -setManeColor :. Если это так, он вызывает этот метод, передавая значение; в противном случае -setValue: forUndefinedKey: вызывается, и если ваш объект не реализует его, генерируется исключение.
Когда делегат вашего синтаксического анализатора получает уведомление о том, что анализ объекта jic unicorn начался, создать экземпляр объекта Unicorn. Когда ваш парсер возвращает вам проанализированные данные, используйте -setValue: forKey: чтобы добавить данные в ваш объект:
- ( void )parserDidBeginParsingDictionary: (SomeParser *)p
{
self.currentUnicorn = [ Unicorn unicorn ];
}
- ( void )parser: (SomeParser *)p didParseString: (NSString *)string
forKey: (NSString *)key
{
[ self.currentUnicorn setValue: string forKey: key ]
}
- ( void )parserDidFinishParsingDictionary: (SomeParser *)p
{
[ self.unicorns addObject: self.currentUnicorn ];
}