2011-02-11 4 views
6

JSON情報を異なるオブジェクトに動的にマップしようとしています。しかし、私はポインタの状況をコントロールする方法を理解することはできません。Objective-C DRY JSONマッピングとオブジェクト作成

私の方法論では、各オブジェクトの辞書を作成し、変数ポインタを同等のJSONキーにマッピングしています。私のJSONマッパーではparseJSONFromDictionary:withObjectというメソッドがあり、SBJSONのJSONValueによって返されたディクショナリを反復処理し、指定されたオブジェクトの適切な変数に適切な値を割り当てます。

-(NSObject *)parseJSONFromDictionary:(NSDictionary *)dict withObject:(NSObject *)start{ 
    for (NSString *key in dict) { 
     if ([[self.mappings objectForKey:key] isMemberOfClass:[NSString class]]) { 
      start.[self.mappings objectForKey:key] = [[dict valueForKey:key] stringValue]; 
     } 
    } 
    return start; 
}

mappings変数とJSONのキーを持っている辞書で、dictは、JSONパーサから返されるものです。

大きな問題は、私がstart.[self.mappings objectForKey:key]を行うことができないということです。私はCについてあまりよく分かりませんが、明らかに私はポインタについて十分に分かっていないので、このようなシステムを作るにはどうしたらいいですか?私はそれが正しい方法ではないことを知っていますが、正しい方法は何ですか? RestKitがそれをしますが、OAuthをサポートしていないので、私は悲しいことに彼らの素敵なフレームワークを使用できません。

私がこのルートに向かう理由は、現在作業しているAPIが現在アルファステージにあるためです。私は、多くのコード行を書き直すことなく、将来の変更に容易に適応できるようにしたいと考えています。私はまた、DRY-lyをプログラミングしたいと思っています。私はJSONの構文解析が非常に反復的であることを知っています。オーバーヘッドの量を減らす方法を探したいと思います。

ありがとうございました!


EDIT:私が求めているものになど、いくつかの混乱があるようです。 I はJSONの解析に役立ちません。私はすでにSBJSONを使用しています。私は要求を助ける必要がありません、私はすでにJDG's OAuthConsumer frameworkを使用していません。 I のみOAuth 2.0をサポートするフレームワークを使用できます。

私はがこれ防ぐ方法考え出す助けが必要なん:だからあなたは1つのメソッドにメソッドのこれらの種類を組み合わせる方法についての提案があれば私に知らせてください

-(Class1 *)parseJsonForClass1:(NSString *)inputString { 
    NSDictionary *outputDict = [inputString JSONValue]; 
    Class1 *instance1 = [self mapObjectsForClass1From:outputDict]; 
    return instance1; 
} 

-(Class2 *)parseJsonForClass2:(NSString *)inputString { 
    NSDictionary *outputDict = [inputString JSONValue]; 
    Class2 *instance2 = [self mapObjectsForClass2From:outputDict]; 
    return instance2; 
} 

-(Class3 *)parseJsonForClass3:(NSString *)inputString { 
    NSDictionary *outputDict = [inputString JSONValue]; 
    Class2 *instance3 = [self mapObjectsForClass3From:outputDict]; 
    return instance3; 
} 

-(Class1 *)mapObjectsForClass1From:(NSDictionary *)dict { 
    Class1 *object1 = [[Class1 alloc] init]; 
    object1.name = [[dict valueForKey:@"name"] stringValue]; 
    object1.date = [[dict valueForKey:@"date"] stringValue]; 
    object1.objId = [[dict valueForKey:@"id"] intValue]; 

    return object1; 
} 

-(Class2 *)mapObjectsForClass2From:(NSDictionary *)dict { 
    Class2 *object2 = [[Class2 alloc] init]; 
    object2.something = [[dict valueForKey:@"something"] stringValue]; 
    object2.title = [[dict valueForKey:@"title"] stringValue]; 
    object2.imageUrl = [[dict valueForKey:@"image_url"] stringValue]; 

    return object2; 
} 

-(Class3 *)mapObjectsForClass3From:(NSDictionary *)dict { 
    Class3 *object3 = [[Class3 alloc] init]; 
    object3.foo = [[dict valueForKey:@"bar"] stringValue]; 
    object3.flag = [[dict valueForKey:@"is_member"] boolValue]; 
    object3.obj1 = [[Class1 alloc] init]; 
    object3.obj1 = [self mapOjectsForClass1From:[dict objectForKey:@"name1"]]; 

    return object3; 
}

を...

+0

https://github.com/RestKit/RestKitを見ましたか? – Brenden

+0

私はRestkitを見ていました。私はそれが何をしたか気に入らず、私はまだしません。私の人生では、RestKitがループ内のオブジェクトを膨張させるよりも、完全なメモリ割り当て曲線を見たことはありません。 – MishieMoo

答えて

2

私は最近実際にObjective Resourcesを使用している人を見ました。オブジェクトにアクセスするのはいい方法ですが、実装の一部が乱雑になることがあります。そして、あなたが好きか否かにかかわらず、サーバーがあなたに送るすべてのものを使用しなければなりません。私は今、これから離れていくつもりです。

0

はまたなど、あなたの肩をオフ通信努力のほとんどの世話をする非同期接続を処理するHTTPRiot、iOS版とこのTutorial about JSON communicationsを見て(Rubyの曲がりが、最小限のは)それを使用する方法を示しています。コードのいくつかは古くなっていますが、全体的にメッセージが届きます。

+0

私はJSONの仕事を以前からやっていましたので、JSONをオブジェクトにパースする方法を知っています。私はちょうど私が得ようとしている各オブジェクトのための個々の機能を持たない方法を理解しようとしています。また、OAuthを使用する必要があるので、HTTPRiotや他のフレームワークを使用することはできません。すでにOAuthが組み込まれていない限り(注:私はそれを見つけていません) – MishieMoo

+0

次にSBJSON (別名JSONフレームワーク)。これは、JSONオブジェクトマーシャリングをシームレスに管理しながら、基礎となるOAuth配管を管理することができます。 – yuvalz

+0

私はすでにSBJSONを使用しています。これはJSONが解析された後のオブジェクトの作成と関係があり、JSONの解析自体ではありません。 – MishieMoo

5

KVCを使用できます。オブジェクトに挿入するJSONディクショナリの各値のセッターを作成し、実際に値を設定するには-setValue:forKey:を使用します。

-(NSObject *)parseJSONFromDictionary:(NSDictionary *)dict withObject:(NSObject *)start 
{ 
    for (NSString *key in [dict allKeys]) 
    { 
     NSString* propertyName = [[self mappings] objectForKey: key]; 
     [start setValue: [dict objectForKey: key] forKey: propertyName]; 
     // the above line will throw an exception if start does not have a set accessor for property 
    } 
    return start; 
} 
+0

これはまさに私が探しているものかもしれません!私は家にいる私のマックに戻ったら、これを確かにテストします。 – MishieMoo

+0

余分なsetterメソッドを書くのではなく(私は可能な限り小さなコードを書こうとしています)、このようなメソッドはsetValueを使うのに適しています:forKey http://www.otakunozoku.com/objective-c-class -properties/?? – MishieMoo

+0

これは間違いなく私が探しているラインに沿っている。私の実装は、主に配列内に作成されたオブジェクトに関連して、関数内に他のオブジェクトを作成してissusを実行しています。 JSON呼び出しの中には、別のオブジェクトにマップする必要のある辞書の配列を返すものがあります。 – MishieMoo

6

私はこれが古いスレッドだと知っていますが、これをここに入れようと思っています。https://github.com/mystcolor/JTObjectMappingのコードは、オブジェクトマッピングを助けることができます。これを使用する前に、マッピングとカスタムオブジェクトを準備する必要があります。 私はこれをgoogling ....で見つけました。それを試してみる必要があります。

関連する問題