【问题标题】:How to parse a JSON having no quotes with its KEY string?如何使用其 KEY 字符串解析没有引号的 JSON?
【发布时间】:2012-05-19 09:37:30
【问题描述】:

我想在 iOS 的 SBJSON 框架中解析来自以下 url 的 json 输出 http://maps.google.com/maps?q=school&mrt=yp&sll=13.006389,80.2575&output=json

while(1);{title:"school - Google Maps",url:"/maps?q=school\x26mrt=yp\x26sll=13.006389,80.2575\x26ie=UTF8\x26hq=school\x26hnear=",urlViewport:false,ei:"RCu3T4eeMqSiiAe7k-yZDQ",form:{selected:"q",q:{q:"school",mrt:"yp",what:"school",near:""},d:{saddr:"",daddr:"",dfaddr:""},geocode:""},

我正在使用http://www.bodurov.com/JsonFormatter/在线阅读。

在 ASIHttpRequest 响应方法中,我从响应中删除了 while(1);

NSString *responseString = [[request resonseString]substringFromIndex:9]; //to remove while(1)
SBJSONParser * parser = [[SBJSONParser alloc]init];
NSDictionary *jsonDict = (NSDictionary*)[parser objectFromString:responseString];
NSLog(@"%@",jsonDict) // prints null
// [responseString JSONValue] also reports error

我猜没有双引号的 JSON 键会导致问题。

而不是 { "title": "医院 - 谷歌地图", “urlViewport”:假, },我们得到 { title: "医院 - 谷歌地图", “urlViewport”:假 }

请帮我解析这个从 Google 返回的复杂 JSON 结构。

【问题讨论】:

  • 我想解析一个 JSON 表示,它的键中没有双引号。
  • 哇,坏了! 坏了!!响应以while(1); 开头,那是无效的 JSON。我不希望任何 JSON 解析器能够处理这个问题。请参阅JSON spec,了解如何格式化 JSON。
  • 假设这不仅仅是一个 NSDictionary 的转储(而且看起来并非如此),那么它就坏了——它根本就不是 JSON。
  • @JefferyThomas - while(1); 是针对某些安全漏洞的经典保护措施。预计将在接收端删除。然而,“JSON”的其余部分被严重破坏了。
  • 我不敢相信谷歌会发送如此糟糕的数据。您必须有一个错误的参数或类似的参数。

标签: objective-c ios sbjson json-framework


【解决方案1】:

这对我的情况更有效,因为我的值包含导致上述答案中的正则表达式匹配不正确的时间。

json = [json stringByReplacingOccurrencesOfString: @"(\\w*[A-Za-z]\\w*)\\s*:"
                                       withString: @"\"$1\":"
                                          options: NSRegularExpressionSearch
                                            range: NSMakeRange(0, json.length)];

【讨论】:

  • 总的来说,同意。对于您知道数据格式(或以其他方式处理错误检查)的特定情况,此 reg ex 比逐个字符地识别格式错误的键要短得多。
  • 如果必须,对于“真实”环境,我宁愿采用开源 JSON 解析器并对其进行修改以处理此问题。
【解决方案2】:

您需要将缺少的引号添加到键中,所以试试这个:

responseString = [responseString stringByReplacingOccurrencesOfString:@"(\\w+)\\s*:" 
                                 withString:@"\"$1\":" 
                                 options:NSRegularExpressionSearch 
                                 range:NSMakeRange(0, [responseString length])];

这应该适用于给定的 JSON 字符串。

【讨论】:

  • 上面给出的 JSON 只是来自link 的两行摘录。我也试过这个解决方案link。但没有希望,我可以更好地使用 kml 输出。感谢您的关注。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-22
  • 2023-03-10
  • 2016-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-21
相关资源
最近更新 更多