web-dev-qa-db-ja.com

NSArrayからJSON文字列を作成します

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

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

そして、私は空の結果を取得します。

26
revolutionkpi

このプロセスは非常に簡単になりました。外部ライブラリを使用する必要はありません。この方法で実行してください(iOS 5以降)

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

カテゴリが大好きなので、このようなことを次のように行います

@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
10
Damo

投票数が最も多い回答は、辞書の配列またはその他のシリアル化可能なオブジェクトに対して有効ですが、カスタムオブジェクトに対しては無効です。

配列をループして各オブジェクトの辞書表現を取得し、それを新しい配列に追加してシリアル化する必要があります。

 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] ;
 }

OfferクラスのdictionaryRepresentationメソッドの場合:

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

    return [NSDictionary dictionaryWithDictionary:mutableDict];
}
6
Rimon

このようにしてみてくださいSwift 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)
}

このようにしてみて、

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

    [jsonWriter release];
    return json;
}

次にこれを

NSString *jsonString = [array JSONRepresentation];

それがあなたを助けることを願っています...

0
Venk

私はこのパーティーに少し遅れていますが、カスタムオブジェクトに-proxyForJsonメソッドを実装することにより、カスタムオブジェクトの配列をシリアル化できます。 (または、カスタムオブジェクトのカテゴリ内。)

の場合。

0
Stig Brautaset