0

JSONを使用してサーバーから情報の一部を取得するiOSのアプリケーションに取り組んでいます。サーバーはまだオンラインになっていないので、サーバーで作業している開発者がサンプル コードとして提供してくれたものを使用してビルドしようとしています。これを行う最も簡単な方法は、JSON 応答を文字列に格納し、NSJSONSerialization.

私が試しているコードは次のようになります。

NSString * JSONString = @"{\"firstName\":\"John\", \"lastName\": \"Smith\", \"age\": 25, \"address\": {\"streetAddress\": \"21 2nd Street\",\"city\": \"New York\", \"state\": \"NY\",\"postalCode\": \"10021\"},}";
bool valid = [NSJSONSerialization isValidJSONObject:JSONString];
if (valid) {
    NSLog(@"Valid JSON");
} else {
    NSLog(@"Invalid JSON");
}

これは常に「無効な JSON」をログに記録します。

私の調査ではすべて、サーバーからデータを取得する方法に関するリソースが提供されていますが、サーバーが利用可能になる前のテストについては何もありません。何か案は?

4

2 に答える 2

0

2つの問題。まず、JSON文字列に余分なコンマがあります。そのはず:

NSString *jsonString = @"{\"firstName\":\"John\", \"lastName\": \"Smith\", \"age\": 25, \"address\": {\"streetAddress\": \"21 2nd Street\",\"city\": \"New York\", \"state\": \"NY\",\"postalCode\": \"10021\"}}";

第二に、しかし、あなたの元のコードには偽陰性があります。文字列は常に失敗しisValidJSONObjectます。このメソッドは、JSON文字列を検証するためのものではありません。を使用する場合はisValidJSONObject、次のように渡す必要がありますNSDictionary

NSDictionary* jsonDictionary = @{
    @"firstName" : @"John",
    @"lastName"  : @"Smith",
    @"age"       : @(25),
    @"address"   : @{
        @"streetAddress": @"21 2nd Street",
        @"city"         : @"New York",
        @"state"        : @"NY",
        @"postalCode"   : @"10021"
    }
};

BOOL valid = [NSJSONSerialization isValidJSONObject:jsonDictionary];
if (valid) {
    NSLog(@"Valid JSON");
} else {
    NSLog(@"Invalid JSON");
}

したがって、JSON文字列を作成する最良の方法は、上記のように辞書を作成してから、を呼び出すことdataWithJSONObjectです。余分なコンマのようなタイプミスはいつでも発生する可能性があるため、通常、JSON文字列を手動で記述することはお勧めしません。NSDictionary文字列が適切に形成されているかどうかを心配する必要がないため、私は常にこのようなものからJSON文字列を作成します。NSJSONSerialization文字列を適切にフォーマットするという大変な作業を処理します。

NSError *error;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonDictionary
                                                   options:0
                                                     error:&error];

if (error)
    NSLog(@"dataWithJSONObject error: %@", error);

NSString *jsonString = [[NSString alloc] initWithData:jsonData
                                             encoding:NSUTF8StringEncoding]);
NSLog(@"JSON string is: %@", jsonString);

その結果、次のようになります。

{"age":25,"lastName":"Smith","firstName":"John","address":{"streetAddress":"21 2nd Street","state":"NY","city":"New York","postalCode":"10021"}}

または、次のNSJSONWritingPrettyPrintedオプションを使用する場合dataWithJSONObject

{
  "age" : 25,
  "lastName" : "Smith",
  "firstName" : "John",
  "address" : {
    "streetAddress" : "21 2nd Street",
    "state" : "NY",
    "city" : "New York",
    "postalCode" : "10021"
  }
}
于 2012-11-15T20:01:54.090 に答える
0

リソースにファイルを保持することでテストします。たとえば、test.json です。次のコードで開くことができます。

NSString *path = [NSBundle.mainBundle pathForResource:@"test.json" ofType:@"json"];
NSError *error = nil;
NSString *fileContents = [NSString stringWithContentsOfFile:path
                                                   encoding:NSUTF8StringEncoding
                                                      error:&error];

次に、メソッドを呼び出して JSON オブジェクトに変換します。テスト ファイルは、上記のものより読みやすくなります。お役に立てれば!

于 2012-11-15T18:29:17.550 に答える