0

好的,我需要在我的 iOS 应用程序上使用 json 来向/从我的服务器发送/接收数据。问题是我对 json 文件的外观有点困惑。我需要发送到服务器的 json 文件看起来像这样:

NSString *jsonString = @"{\"eventData\":{\"eventDate\":\"Jun 13, 2012 12:00:00 AM\",\"eventLocation\":{\"latitude\":43.93838383,\"longitude\":-3.46},\"text\":\"lalalala\",\"imageData\":\"raw data\",\"imageFormat\":\"JPEG\",\"expirationTime\":1339538400000},\"type\":\"ELDIARIOMONTANES\",\"title\":\"accIDENTE\"}";

当我尝试在控制台中打印它时,我得到:

jsonString: {"eventData":{"eventDate":"Jun 13, 2012 12:00:00 AM","eventLocation":{"latitude":43.93838383,"longitude":-3.46},"text":"lalalala","imageData":"raw data","imageFormat":"JPEG","expirationTime":1339538400000},"type":"ELDIARIOMONTANES","title":"accIDENTE"}

根据在线 json 验证器,这似乎是一种有效的 json 格式。

但是,在搜索了网络之后,当然还有 stackoverflow,并且在询问了另一个问题之后,我发现我应该将上面的 NSString 转换为这样的 json 文件:

NSString *jsonString = @"{\"eventData\":{\"eventDate\":\"Jun 13, 2012 12:00:00 AM\",\"eventLocation\":{\"latitude\":43.93838383,\"longitude\":-3.46},\"text\":\"lalalala\",\"imageData\":\"raw data\",\"imageFormat\":\"JPEG\",\"expirationTime\":1339538400000},\"type\":\"ELDIARIOMONTANES\",\"title\":\"accIDENTE\"}";

    NSData *jsonData = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
    NSError *e;
    NSMutableArray *jsonList = [NSJSONSerialization JSONObjectWithData:jsonData options:NSJSONReadingMutableContainers error:&e];

但是,如果我尝试打印 jsonList 变量,我认为这将是 json 格式/文件,我会得到:

jsonList: {
    eventData =     {
        eventDate = "Jun 13, 2012 12:00:00 AM";
        eventLocation =         {
            latitude = "43.93838383";
            longitude = "-3.46";
        };
        expirationTime = 1339538400000;
        imageData = "raw data";
        imageFormat = JPEG;
        text = lalalala;
    };
    title = accIDENTE;
    type = ELDIARIOMONTANES;
}

这不是一个有效的 json 文件!!!!所以我的问题是,如果我从一开始就有正确的格式到我的 json 文件,为什么所有这些额外的代码都将它“转换”为 json?我想,我一定是在这里遗漏了一些东西或误解了代码的功能。非常感谢您阅读我的帖子 :)

4

2 回答 2

1

你看到的是正确的行为:

如果我尝试打印 jsonList 变量,我认为这将是 json 格式/文件

你的jsonList变量是一个NSMutableArray. 该-JSONObjectWithData方法返回一个 Objective-C 对象(一个 Core Foundation 对象)——而不是一个 JSON 字符串。它已经解析了您的 JSON 字符串,并返回了一个表示该 JSON 数据的对象。

于 2012-06-25T09:01:33.793 回答
1

我认为你让自己有点纠结:-)如果你有一个 NSString 包含你想要发送的数据,那么使用 JSONObjectWithData 等是没有意义的,你不妨只发送你拥有的字符串已经。

但是,如果您想从服务器提取作为 JSON 接收的数据位,那么您将创建想要使用这些方法的时间。从解析的 JSON 对象中获取数据要容易和可靠得多,而这只是一个大的旧纯 JSON 字符串(正则表达式不是从 JSON 中提取数据的好方法)。

另一种情况是您想在代码中构建一个大而复杂的 JSON 对象,然后将其作为 JSON 字符串发送到您的服务器。您不想通过将 NSStrings 附加在一起来尝试此操作(很快就会变得讨厌),最好将您的数据放在 NSMutableArrays 或 NSDictionaries 中,然后转换为 JSON。

这是一个简单的例子(来自这里

NSDictionary *data = [NSDictionary dictionaryWithObjectsAndKeys:@"test@test.com", @"user",@"mypass", @"pass", nil];

NSError *error = nil;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:data options:NSJSONWritingPrettyPrinted error:&writeError];

NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
NSLog(@"JSON Output: %@", jsonString);
于 2012-06-25T09:11:03.823 回答