2013-07-23 11 views
18

私のiPhoneアプリケーションでは、私はカスタムオブジェクトのリストを持っています。私はそれらからjsonの文字列を作成する必要があります。 SBJSONまたはiPhone SDKでこれをどのように実装できますか?NSArrayからjson文字列を作成します。

NSArray* eventsForUpload = [app.dataService.coreDataHelper fetchInstancesOf:@"Event" where:@"isForUpload" is:[NSNumber numberWithBool:YES]]; 
    SBJsonWriter *writer = [[SBJsonWriter alloc] init]; 
    NSString *actionLinksStr = [writer stringWithObject:eventsForUpload]; 

と空の結果が得られます。

+0

は、 "カスタムオブジェクト" を定義するようにしてください。 –

+0

このコードではどのような問題がありますか? –

+0

結果が空になる – revolutionkpi

答えて

0

は、

NSString *jsonString = [array JSONRepresentation]; 

が、それは願っています、これはのように呼び出して

- (NSString *)JSONRepresentation { 
    SBJsonWriter *jsonWriter = [SBJsonWriter new];  
    NSString *json = [jsonWriter stringWithObject:self]; 
    if (!json) 

    [jsonWriter release]; 
    return json; 
} 

、次のように試してみてください。このプロセスは今、本当に簡単です、あなたが...

+0

私は問題が "作者は何とか解釈する方法を知っていなければならない。すべてが配列/辞書にあればずっと簡単です。 –

+2

上記のコードは壊れています。リリースを呼び出すため、ARCの下でコンパイルが失敗するか、または 'self'をJSON化できない場合にのみライターをリリースするため、メモリがリークします。 –

46

を助け、あなたはしないでください外部ライブラリを使用する必要があります。 このようにしてください(上記のiOS 5 &)

NSArray *myArray; 
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:myArray options:NSJSONWritingPrettyPrinted error:&error]; 
NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding]; 
9

@implementation NSArray (Extensions) 

- (NSString*)json 
{ 
    NSString* json = nil; 

    NSError* error = nil; 
    NSData *data = [NSJSONSerialization dataWithJSONObject:self options:NSJSONWritingPrettyPrinted error:&error]; 
    json = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 

    return (error ? nil : json); 
} 

@end 
+1

ちょっと単純なエラーコントロールを使った方が良い: return(エラー?nil:json); – anavarroma

0

私はこのパーティーに少し遅れだけど、あなたはあなたの中に-proxyForJson方法を実装することで、カスタムオブジェクトの配列をシリアライズすることができますが、以下のように、私はこの種のものを行うので、私は私のカテゴリを愛しカスタムオブジェクト。 (またはカスタムオブジェクトのカテゴリで)

exampleの場合。

4

最高の投票回答は、辞書やその他のシリアライズ可能なオブジェクトの配列に対して有効ですが、カスタムオブジェクトに対しては無効です。

ここでは、配列をループして各オブジェクトの辞書表現を取得し、それを直列化する新しい配列に追加する必要があります。オファークラスのdictionaryRepresentation方法として

NSString *offersJSONString = @""; 
if(offers) 
{ 
    NSMutableArray *offersJSONArray = [NSMutableArray array]; 
    for (Offer *offer in offers) 
    { 
     [offersJSONArray addObject:[offer dictionaryRepresentation]]; 
    } 

    NSData *offersJSONData = [NSJSONSerialization dataWithJSONObject:offersJSONArray options:NSJSONWritingPrettyPrinted error:&error]; 

    offersJSONString = [[NSString alloc] initWithData:offersJSONData encoding:NSUTF8StringEncoding] ; 
} 

- (NSDictionary *)dictionaryRepresentation 
{ 
    NSMutableDictionary *mutableDict = [NSMutableDictionary dictionary]; 
    [mutableDict setValue:self.title forKey:@"title"]; 

    return [NSDictionary dictionaryWithDictionary:mutableDict]; 
} 
2

このスウィフト2.3

let consArray = [1,2,3,4,5,6] 
var jsonString : String = "" 
do 
{ 
    if let postData : NSData = try NSJSONSerialization.dataWithJSONObject(consArray, options: NSJSONWritingOptions.PrettyPrinted) 
    { 
     jsonString = NSString(data: postData, encoding: NSUTF8StringEncoding)! as String 
    } 
} 
catch 
{ 
    print(error) 
} 
関連する問題