【问题标题】:NSJSONSerialization parsing response dataNSJSONSerialization 解析响应数据
【发布时间】:2012-01-28 20:01:57
【问题描述】:

我创建了一个 WCF 服务,它为我的 POST 操作提供以下响应:

"[{\"Id\":1,\"Name\":\"Michael\"},{\"Id\":2,\"Name\":\"John\"}]"

我对 JSONObjectWithData 的调用没有返回任何错误,但我无法枚举结果,我做错了什么?

NSError *jsonParsingError = nil;
NSMutableArray *jsonArray = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers|NSJSONReadingAllowFragments error:&jsonParsingError];

NSLog(@"jsonList: %@", jsonArray);

if(!jsonArray)
{
    NSLog(@"Error parsing JSON:%@", jsonParsingError);
}
else
{
    // Exception thrown here.        
    for(NSDictionary *item in jsonArray)
    {
        NSLog(@"%@", item);
    }
}

【问题讨论】:

  • 抛出什么类型的异常?
  • 您的 NSLog 是否从 jsonArray 输出任何内容?
  • @Jacob-Relkin - 例外是:EXC_BAD_INSTRUCTION
  • @Jeremy - 这是 jsonArray 的输出: jsonList: [{"Id":1,"Name":"Michael"},{"Id":2,"Name":"John" }]
  • 你确定你总是返回一个数组,即使响应只包含一个项目?

标签: objective-c ios ios5 nsjsonserialization


【解决方案1】:

使用 NSJSONSerialization 解析很容易,但我还创建了一个小框架,允许将 JSON 值直接解析为类对象,而不是处理字典。看一下,可能会有所帮助: https://github.com/mobiletoly/icjson

【讨论】:

    【解决方案2】:

    正如 Jeremy 指出的,您不应该转义 JSON 数据中的引号。而且,您已经引用了返回字符串。这使它成为一个 JSON 字符串,而不是一个对象,所以当你解码它时,你有一个字符串,而不是一个可变数组,这就是为什么你在尝试快速迭代时会出错......你不能快速迭代字符串。

    您的实际 JSON 应如下所示:[{"Id":1,"Name":"Michael"},{"Id":2,"Name":"John"}]。没有引号,没有转义。消除 JSON 对象周围的引号后,您的应用将不再崩溃,但随后您将收到格式错误数据(转义)的 JSON 反序列化错误。

    【讨论】:

    • 感谢杰森。就是这样。我意识到我的 WCF 服务编码错误。而不是我的返回类型是一个字符串,它应该是一个 List,只有 ResponseFormat 应该是 json,其余的会自己处理。因为我返回了一个实际的字符串,所以所有内容都被转义了,并且整个字符串都被引用了。
    【解决方案3】:

    可能的原因是您使用了错误的基础对象。尝试将 NSMutableArray 更改为 NSDictonary。

    发件人:

    NSMutableArray *jsonArray = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers|NSJSONReadingAllowFragments error:&jsonParsingError];
    

    收件人:

    NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers|NSJSONReadingAllowFragments error:&jsonParsingError];
    

    【讨论】:

    • 抱歉,我的回答假设您没有遇到异常。但是,由于您已在上面的评论中声明您遇到了异常,因此您的 json 很可能格式不正确。您的响应实际上不应该发送转义。
    • 感谢您指出这一点。我从提琴手的输出是 "[{\"Id\":1,\"Name\":\"Michael\"},{\"Id\":2,\"Name\":\"John\"} ]",它有转义。我将更新我的 wcf 服务,使其不会在响应中发送转义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    • 2022-01-12
    • 2013-08-23
    • 2012-08-28
    相关资源
    最近更新 更多