RestKit después de publicar json, cómo asignar la respuesta json a los objetos

sigo este enlace https://github.com/RestKit/RestKit/wiki/Posting-NSDictionary-as-JSON para crear la publicación json y recuperar la respuesta json del servidor. ¿Cómo podría continuar procesando la respuesta json a una lista de objetos?

- (void)sendAsJSON:(NSDictionary*)dictionary {

    RKClient *client = [RKClient clientWithBaseURL:@"http://restkit.org"];        

    // create a JSON string from your NSDictionary 
    id<RKParser> parser = [[RKParserRegistry sharedRegistry] parserForMIMEType:RKMIMETypeJSON];
    NSError *error = nil;
    NSString *json = [parser stringFromObject:dictionary error:&error];

    // send your data
    if (!error)
        [[RKClient sharedClient] post:@"/some/path" params:[RKRequestSerialization serializationWithData:[json dataUsingEncoding:NSUTF8StringEncoding] MIMEType:RKMIMETypeJSON] delegate:self];

}


- (void)request:(RKRequest *)request didLoadResponse:(RKResponse *)response
{
    NSLog(@"after posting to server, %@", [response bodyAsString]);
}

EDIT1: este es el Json que quiero POST al servidor.

{
    "memberId": "1000000",
    "countryCode": "US",
    "contacts": [
        {
            "phoneNumber": "+12233333333",
            "memberId": "2222",
            "contactId": "123456",
            "name": "john"
        },
        {
            "phoneNumber": "+12244444444",
            "memberId": "3333",
            "contactId": "123457",
            "name": "mary"
        }
    ]
}

EDIT2: Alguien realmente resolvió esto en otro hilo. https://stackoverflow.com/a/7726829/772481

preguntado el 04 de julio de 12 a las 01:07

2 Respuestas

Utilice RKObjectManger en lugar de RKClient para realizar la POST. Luego puede cargar la respuesta en objetos cuando se llama a este método:

- (void)objectLoader:(RKObjectLoader*)objectLoader didLoadObjects:(NSArray*)objects

EDITAR (dado JSON para enviar al servidor):

En lugar de crear el JSON de la forma en que lo está haciendo actualmente, puede crear clases de modelo personalizadas.

Primero, puede crear una clase modelo para su objeto de nivel superior (suponiendo que se llame Usuario).

Encabezado de usuario

//  User.h

#import <Foundation/Foundation.h>

@interface User : NSObject

@property (nonatomic) int memberId;
@property (nonatomic, copy) NSString *countryCode;
@property (nonatomic, strong) NSArray *contacts;

@end

Implementación de usuario

//  User.m

#import "User.h"

@implementation User

@synthesize memberId;
@synthesize countryCode;
@synthesize contacts;

@end

Luego, puede crear una clase modelo llamada Contacto.

Encabezado de contacto

//  Contact.h

#import <Foundation/Foundation.h>

@interface Contact : NSObject

@property (nonatomic, strong) NSString *phoneNumber;
@property (nonatomic) int memberId;
@property (nonatomic) int contactId;
@property (nonatomic, strong) NSString *name;

@end

Contacto Implementación

//  Contact.m

#import "Contact.h"

@implementation Contact

@synthesize phoneNumber;
@synthesize memberId;
@synthesize contactId;
@synthesize name;

@end

Puedes usar estas clases así:

Contact *john = [[Contact alloc] init];
john.phoneNumber = @"+12233333333";
john.memberId = 2222;
john.contactId = 123456;
john.name = @"john";

Contact *mary = [[Contact alloc] init];
mary.phoneNumber = @"+12244444444";
mary.memberId = 3333;
mary.contactId = 123457;
mary.name = @"mary";

User *user = [[User alloc] init];
user.memberId = 1000000;
user.countryCode = @"US";
user.contacts = [NSArray arrayWithObjects:john, mary, nil];

RKObjectMapping *contactsMapping = [RKObjectMapping mappingForClass:[Contact class]];
[contactsMapping mapKeyPath:@"phoneNumber" toAttribute:@"phoneNumber"];
[contactsMapping mapKeyPath:@"memberId" toAttribute:@"memberId"];
[contactsMapping mapKeyPath:@"contactId" toAttribute:@"contactId"];
[contactsMapping mapKeyPath:@"name" toAttribute:@"name"];

RKObjectMapping *objectMapping = [RKObjectMapping mappingForClass:[User class]];
[objectMapping mapKeyPath:@"memberId" toAttribute:@"memberId"];
[objectMapping mapKeyPath:@"countryCode" toAttribute:@"countryCode"];
[objectMapping mapKeyPath:@"contacts" toRelationship:@"contacts" withMapping:contactsMapping];

//Then you set up a serialization mapping and object mapping and POST it

//This method takes care of both the serialization and object mapping
[[RKObjectManager sharedManager].mappingProvider registerMapping:objectMapping withRootKeyPath:@"user"]; 

//POST it
[[RKObjectManager sharedManager] postObject:user delegate:self];

Necesitaría saber qué tipo de respuesta JSON espera antes de poder mostrarle cómo hacer el mapeo de serialización y el POST.

EDITAR (dado JSON devuelto por el servidor):

Para configurar el mapeo de serialización y el mapeo de objetos y PUBLICARLO, deberá configurar la ruta del recurso (lo hago cuando inicio mi aplicación):

RKObjectRouter *router = [RKObjectManager sharedManager].router;
[router routeClass:[User class] toResourcePath:@"/users" forMethod:RKRequestMethodPOST];

Su ruta de recursos puede ser algo diferente a "/usuarios".

Echa un vistazo al código debajo del comentario. //Then you set up a serialization mapping and object mapping and POST it, donde he agregado el mapeo de serialización, el mapeo de objetos y el POSTing.

Respondido 04 Jul 12, 11:07

¿RKObjectManger me permite PUBLICAR un cuerpo Json? - Angelokh

Sí. Debe configurar un mapeo de objetos para convertir sus objetos en JSON. ¿Sabes como hacer esto? Si no lo hace, deme un ejemplo de un objeto que desee PUBLICAR y le mostraré cómo hacerlo. - ill_always_be_a_warriors

Puse el json bajo mi pregunta. El Json se crea mediante programación. - Angelokh

Ver la respuesta actualizada. ¿Cuál es el JSON que espera que devuelva el servidor? - ill_always_be_a_warriors

Básicamente la misma cadena JSON. Este POST se utiliza para filtrar contactos. Digamos que el POST contiene 5 contactos y podría devolver 3 contactos. Quiero que estos 3 contactos se guarden en datos básicos. Ya tengo clase para contacto, sin embargo, es NSManagedObject. - Angelokh

Normalmente en esta situación usarías RKObjectLoader, a la que se puede acceder a través de RKObjectManager como dijo @ill_always_be_a_warriors. La razón por la que usa esto es porque incluye mapeo de objetos gratuito si está configurado. Una cosa a tener en cuenta es que publica un 'objeto' y no JSON directamente. Para obtener más información, intente mirar el Ejemplos de RestKit para ver cómo hacer esto, ENTONCES, si todavía tiene problemas, publique una pregunta aquí.

Respondido 04 Jul 12, 07:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.