No conozco ninguna implementación específica, pero la codificación de clave-valor te acerca mucho a lo que deseas: Key Value Coding Guide. He tenido buenos resultados combinando streamed json parsing con KVC.
El método -setValue: forKey: hace que la adaptación de datos serializados a objetos personalizados sea bastante sencilla. Para continuar con su ejemplo, crearía una clase Unicornio con todos los métodos de acceso requeridos: -setName:/- name, -setManeColor/-maneColor, etc. (Es posible que pueda usar propiedades para algunos valores esperados, pero existen casos, como con el valor maneColor, donde probablemente desee escribir un setter personalizado para convertir de la cadena de nombre de color a un objeto NSColor o UIColor).
También deseará agregar dos métodos más a su objeto personalizado : -setValue: forUndefinedKey: y -valueForUndefinedKey :. Estos son los métodos que serán llamados si su objeto no tiene métodos de acceso que coincidan con una clave pasada a los métodos de KVC. Puede capturar valores inesperados o no admitidos aquí, y almacenarlos o ignorarlos según sea necesario.
Cuando envía -setValue: forKey: al objeto Unicornio, el marco busca accesadores que coincidan con el patrón de teclas. Por ejemplo, si la clave es "maneColor" y está estableciendo el valor, el marco verifica si su objeto implementa -setManeColor :. Si es así, invoca ese método, pasando el valor; de lo contrario, se llama a -setValue: forUndefinedKey: y si su objeto no lo implementa, se lanza una excepción.
Cuando el delegado de su analizador recibe la notificación de que ha comenzado el análisis de un objeto unicornio json, crea una instancia de un objeto Unicornio. A medida que su analizador devuelve los datos analizados a usted, use -setValue: forKey: añadir los datos a su objeto:
- (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 ];
}
+1 para unicornios – psy