2013-04-17 4 views
0

개체의 NSArray를 직렬화하려고합니다. 나는이 객체를 포함하고있는 NSArray이있는 경우RestKit 0.20 NSArray 직렬화 문제

{"age":1,"name":"Foo"} 

, 그것으로 직렬화한다 :

목적은로 직렬화

[{"age":1,"name":"Bob"},{"age":4,"name":"Sally"},{"age":2,"name":"Jill"}] 

을 그러나, 나는 RestKit를 통해 직접 직렬화 할 때, 내가 얻을 다음 :

{"age":[1,3,2],"name":["Sally","Jack","Bob"]} 

내가 RKMIMETypeSerialization을 검사 할 때, 나는 fo llowing : 나는 정말 바보 같은 일을하고 있어요 확신

Parameters: { 
    age =  (
     1, 
     3, 
     2 
    ); 
    name =  (
     Sally, 
     Jack, 
     Bob 
    ); 
} 

(json으로 출력을 일치합니다), 나는 그것을 알아낼 수 없습니다 그것으로 연주되었다. 여기

내 매핑 로직

+ (RKObjectMapping *)mapping { 
    RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[Item class]]; 
    [mapping addAttributeMappingsFromDictionary:@{ 
      @"name" : @"name", 
      @"age" : @"age" 
    }]; 

    return mapping; 
} 

입니다 그리고 여기 배열 직렬화하고 논리입니다 : Item.h

#import <Foundation/Foundation.h> 

@interface Item : NSObject 
@property(nonatomic, strong) NSString *name; 
@property(nonatomic) int age; 

+ (void)testJsonSerialization; 

+ (void)testJsonArraySerialization; 

+ (Item *)itemWithName:(NSString *)string age:(int)age; 
@end 
을 : 여기
+ (NSString *)JSONStringFromArray:(NSArray *)array { 
    RKObjectMapping *mapping = [Item mapping]; 
    RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:mapping.inverseMapping objectClass:[Item class] rootKeyPath:nil]; 
    NSError *error; 
    NSDictionary *parameters = [RKObjectParameterization parametersWithObject:array requestDescriptor:requestDescriptor error:&error]; 

// Serialize the object to JSON 
    NSData *JSON = [RKMIMETypeSerialization dataFromObject:parameters MIMEType:RKMIMETypeJSON error:&error]; 

    NSString *jsonString = [[NSString alloc] initWithBytes:[JSON bytes] 
                length:[JSON length] encoding:NSUTF8StringEncoding]; 
    return jsonString; 
} 

테스트 클래스입니다을

Item.m

#import "Item.h" 
#import <RestKit.h> 

@implementation Item 
+ (RKObjectMapping *)mapping { 
    RKObjectMapping *mapping = [RKObjectMapping mappingForClass:[Item class]]; 
    [mapping addAttributeMappingsFromDictionary:@{ 
      @"name" : @"name", 
      @"age" : @"age" 
    }]; 

    return mapping; 
} 

- (NSString *)JSONString { 
    RKObjectMapping *mapping = [Item mapping]; 
    RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:mapping.inverseMapping objectClass:[Item class] rootKeyPath:nil]; 
    NSError *error; 
    NSDictionary *parameters = [RKObjectParameterization parametersWithObject:self requestDescriptor:requestDescriptor error:&error]; 

// Serialize the object to JSON 
    NSData *JSON = [RKMIMETypeSerialization dataFromObject:parameters MIMEType:RKMIMETypeJSON error:&error]; 

    NSString *jsonString = [[NSString alloc] initWithBytes:[JSON bytes] 
                length:[JSON length] encoding:NSUTF8StringEncoding]; 
    return jsonString; 
} 

+ (NSString *)JSONStringFromArray:(NSArray *)array { 
    RKObjectMapping *mapping = [Item mapping]; 
    RKRequestDescriptor *requestDescriptor = [RKRequestDescriptor requestDescriptorWithMapping:mapping.inverseMapping objectClass:[Item class] rootKeyPath:nil]; 
    NSError *error; 
    NSDictionary *parameters = [RKObjectParameterization parametersWithObject:array requestDescriptor:requestDescriptor error:&error]; 

// Serialize the object to JSON 
    NSData *JSON = [RKMIMETypeSerialization dataFromObject:parameters MIMEType:RKMIMETypeJSON error:&error]; 

    NSString *jsonString = [[NSString alloc] initWithBytes:[JSON bytes] 
                length:[JSON length] encoding:NSUTF8StringEncoding]; 
    return jsonString; 
} 

+ (void)testJsonSerialization { 
    Item *item = [Item itemWithName:@"Foo" age:1]; 
    NSString *itemJSON = [item JSONString]; 
    NSLog(@"ItemJSON:\n%@\n\n", itemJSON); 
} 

+ (void)testJsonArraySerialization { 
    NSArray *items = @[[Item itemWithName:@"Sally" age:1], [Item itemWithName:@"Jack" age:3], [Item itemWithName:@"Bob" age:2]]; 
    NSString *itemJSON = [Item JSONStringFromArray:items]; 
    NSLog(@"ItemArrayJSON:\n%@\n\n", itemJSON); 
} 

+ (Item *)itemWithName:(NSString *)name age:(int)age { 
    Item *item = [[Item alloc] init]; 
    item.name = name; 
    item.age = age; 
    return item; 
} 
@end 

설치 유무 RestKit 포드를 실행 한 후 다음을 실행하려면 : 어쩌면 내가 배열 직렬화 올바르게 매핑을 구성하고 있지 않다,

[Item testJsonSerialization]; 
    [Item testJsonArraySerialization]; 

참고. 이 매퍼는 위의 대상 json 텍스트를 deserialize하기 위해 완벽하게 작동하지만

+0

'RKObjectParameterization parametersWithObject :'의 출력을 확인하십시오. 예상 한 것입니까? – Wain

+0

매개 변수는 예상했던 것과 다르며 json 출력과 거의 일치합니다. – GreenKiwi

+0

각 객체가 하나의 속성 집합을 가진 사전 인 객체의 배열이라는 것을 알았을 것입니다. – GreenKiwi

답변

1

RKObjectParameterization은 개체 매핑의 대상 인스턴스를 serialize하는 데 사용되며 인스턴스를 NSMutableDictionary에 정적으로 serialize하는 것으로 예상됩니다.과 함께 사용할 맵핑을 작성하여 오브젝트 배열을 사전 배열에 직렬화 할 수 없습니다. 배열을 반복하여이 작업을 직접 수행해야합니다.

+0

배열을 반복 할 수있는 유일한 방법은 무엇입니까? 파머. 그것은 실제로 제가 사용해온 작업 이었지만, 다른 방법이 있기를 바랬습니다. 따라서 내부의 객체는 (관계 매핑을 통해) 배열이 될 수 있지만 최상위 객체는 될 수 없습니다. 더 간단하게 만들기 위해 다른 방법이 있다면 궁금합니다. 배열에 원하는 항목이 포함 된 객체를 하나의 배열로 항상 만들 수 있다고 생각합니다. – GreenKiwi

+0

일을하는 유일한 방법처럼 보입니다. 그래서 이것은 답처럼 느껴집니다. – GreenKiwi

관련 문제