iosobjective-crestkitrkobjectmappingrestkit-0.24.x

How to map a local JSON string into an object using RestKit 0.24 with RKObjectMapping?


I am trying to map a JSON NSString into an object using RestKit 0.24.0 where I have a RKObjectMapping as well as the corresponding dictionary.

Most of the solutions online refer to RestKit 0.22 and below.

Some of the solutions on SO result into app crash.

What is the easiest way to convert a local string into an object. Consider the following

CODE UPDATE

    RKMapperOperation *mapper = [[RKMapperOperation alloc] initWithRepresentation:parsedData mappingsDictionary:[RJobObject mappingDictionary]];
    RJobObject * rrrr = [[RJobObject alloc] init];
    mapper.targetObject = rrrr;
    //mapper.mappingOperationDataSource = parsedData;


    [mapper execute:nil];

Here , mappingDictionary is basically the key-value pair matching between the JSON key and Object variable name So in the above code whenever I run execute, the app crashes.

Stack Trace

    2015-11-22 09:12:29.193 Help[22427:699579] -[__NSCFConstantString forceCollectionMapping]: unrecognized selector sent to instance 0x1022736a0
    2015-11-22 09:12:29.211 Help[22427:699579] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFConstantString forceCollectionMapping]: unrecognized selector sent to instance 0x1022736a0'
    *** First throw call stack:
    (
     0   CoreFoundation                      0x0000000105d7dc65 __exceptionPreprocess + 165
     1   libobjc.A.dylib                     0x0000000105a14bb7 objc_exception_throw + 45
     2   CoreFoundation                      0x0000000105d850ad -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
     3   CoreFoundation                      0x0000000105cdb13c ___forwarding___ + 988
     4   CoreFoundation                      0x0000000105cdacd8 _CF_forwarding_prep_0 + 120
     5   Help                                0x000000010212f424 -[RKMapperOperation mapRepresentationOrRepresentations:atKeyPath:usingMapping:] + 132
     6   Help                                0x000000010212fe97 -[RKMapperOperation mapSourceRepresentationWithMappingsDictionary:] + 1959
     7   Help                                0x00000001021307a2 -[RKMapperOperation main] + 1330
     8   Foundation                          0x00000001034c4774 -[__NSOperationInternal _start:] + 645
     9   Help                                0x00000001021310b7 -[RKMapperOperation execute:] + 39
     10  Help                                0x0000000101f62f8e -[AppDelegate fetchJobsFromDB] + 1102

More Details

Updated to RestKit 0.26.0 , am still facing the issue.

Basically in RKMapperOperation.m, line 333 a po mapping.forceCollectionMapping gives an error and it crashed the app.

ANSWER : Sample Solution Use RKMappingOperation , as we do not have to specify the keyPath

    RJobObject * rrrJob = [RJobObject new];
    RKMappingOperation *mappingOperation = [[RKMappingOperation alloc] initWithSourceObject:jobEntity.dictionary destinationObject:rrrJob mapping:[RJobObject mapping]];
    mappingOperation.dataSource = (id)rrrJob;
    [mappingOperation start];

Solution

  • For what you're trying to do 'parsedData' should be a dictionary or array that has been deserialised from the JSON string, and [RJobObject mappingDictionary] should be a dictionary where the keys are the source key paths and the values are RKMapping Instances defining what to do with the contents.

    The idea is that the key paths determine how to drill into the JSON data and the mapping determines how to process the content found there. Your key path might be an empty string if you want to process the whole JSON data.

    You might consider using RKMappingOperation instead if you want to avoid the key path complexity and you're mapping the whole JSON into a single target object.