空 JSON 响应

Posted

技术标签:

【中文标题】空 JSON 响应【英文标题】:Null JSON response 【发布时间】:2015-04-19 22:17:42 【问题描述】:
NSString *connection = @"http:"(link);

dispatch_queue_t queue  =  dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_async(queue, ^
    NSError *error = nil;
    NSURL *url = [NSURL URLWithString:connection];
    NSString *json = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];

    NSLog(@"\nJSON: %@ \n Error: %@", json, error);

    if(!error) 
        NSData *jsonData = [json dataUsingEncoding:NSUTF8StringEncoding];
        NSLog(@"%@",jsonData);
        NSMutableArray *jsonDict = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&error];

        NSLog(@"JSON: %@", jsonDict);        
    
);

以上代码返回:

JSON: "\"value\":[\"Id\":\" 

但是 NSData69746963 735c222c 5c224973 41767469 76655c22 3a5c2231 5c222c jsonDict 返回 (null)

我对可能发生的事情感到困惑。 谁能帮我弄清楚。

我正在尝试获取 JSON 数据,但它返回 null。

谢谢

【问题讨论】:

NSData 的日志没问题。那是字节,而不是指针。记录调用 JSONObjectWithData 的错误。 看起来返回的 json 无效,因此 NSJSONSerialization 失败。错误为零吗? Erro : Error Domain=NSCocoaErrorDomain Code=3840 “操作无法完成。(Cocoa 错误 3840。)”(JSON 文本没有以数组或对象开头,并且允许未设置片段的选项.) UserInfo=0x7f8cbacbc2e0 NSDebugDescription=JSON 文本没有以数组或对象开头,并且允许未设置片段的选项。 如何解决此错误?是否只能通过 Web 服务本身实现? -> JamesSugrue 一切都很好,你只是在打印字节。 修复服务器,使其返回有效的 JSON。 【参考方案1】:

你说服务器给你这个:

JSON: "\"value\":[\"Id\":\" 

如果我删除 NSLog 命令添加的反斜杠,您收到的实际 JSON 是

"value":["Id":" 

这不是有效的 JSON。这里的所有都是它的;服务器向您发送了垃圾数据,并且无法从中获取任何信息。联系创建服务器软件的人员并要求他们解决问题。

你真的,真的需要区分对象真正包含的内容和 NSLog 打印的内容。 NSLog 通过将每个字节显示为两个十六进制数字来打印 NSData 对象的内容。

【讨论】:

由于某些原因,当我从 Web 服务复制数据本身并在 JSONLint (jsonValidator) 中运行时,它说数据是 JSON 有效的。但是当我复制粘贴网站链接时,它说数据不是 JSON 有效的。我想知道这可能是什么问题。【参考方案2】:

尝试其中一个(数组或字典)而不将其转换为 JSON,这取决于您想要什么:

NSString *connection = @"http://(link)";

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(queue, ^
    NSDictionary *jsonDict = [NSDictionary dictionaryWithContentsOfURL:[NSURL URLWithString:connection]];
    NSArray *jsonArray = [NSArray arrayWithContentsOfURL:[NSURL URLWithString:connection]];
    NSLog(@"DICT: %@ ARRAY: %@", jsonDict, jsonArray);
);

我没试过,请粘贴结果?

【讨论】:

情感它仍然返回 null DICT: (null) ARRAY: (null)【参考方案3】:

从您的NSString 响应来看,它以 开头并以 结尾,这意味着它是NSDictionary

改变:

NSMutableArray *jsonDict = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:&error];

到:

NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:jsonData options:nil error:&error];

【讨论】:

由于某些原因,它以“”开头并以“”标记结尾。所以,我认为这可能是我们没有从 Web 服务获取任何类型数据的原因。 JSON: "\"value\":[\"Id\":\" 您的内容类型设置为纯文本还是什么? header("Content-Type:text/plain"); 尝试使用上述代码在 php 顶部的 header('Content-Type: application/json');header('Content-Type: text/plain'); 之间进行更改。 我尝试使用 www.hurl.it。我仍然返回相同的值。我认为问题是“在值字典开始之前。我想我必须与 Web 服务器处理程序交谈,或者必须想办法摆脱”当我得到 JSON 数据时 是的,它的引用和添加斜杠..?尝试询问超级用户

以上是关于空 JSON 响应的主要内容,如果未能解决你的问题,请参考以下文章

SonataUserBundle Api 响应返回空 JSON

改造解析JSON响应空值Android

.NET Core:从 API JSON 响应中删除空字段

在 WebAPI 中返回空 json

防止空 JSON 响应被映射 RestKit 0.22.0

为啥我从这个请求 iOS JSON 得到空响应