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"
}
}