0

我正在开发一个 iOS 应用程序,它使用 JSON 从服务器获取一些信息。服务器还没有上线,所以我尝试使用在服务器上工作的开发人员给我的东西作为示例代码来构建。我认为最简单的方法是将 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

我通过在我的资源中保存一个文件来进行测试,例如 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 回答
0

两个问题。首先,您的 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 字符串,因为您总是可以引入诸如额外逗号之类的拼写错误。我总是从这样的一个 JSON 字符串中构建一个 JSON 字符串NSDictionary,因为您永远不必担心字符串是否格式正确。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 回答