无法将 json 字符串解析为 nsdictionary

Posted

技术标签:

【中文标题】无法将 json 字符串解析为 nsdictionary【英文标题】:cannot parse json string into nsdictionary 【发布时间】:2011-08-12 06:06:01 【问题描述】:

我正在尝试使用 sbjsonparser 解析 json 字符串。我无法将其转换为 nsdictionary。我在我的其他课程中使用了 sbjsonparser,它们都运行良好。查看我的代码。

-(void)parseJsonString

    NSLog(@"%@",jsonString);
    SBJsonParser *parser = [[SBJsonParser alloc] init]; 
    NSDictionary *dict;
    dict = [parser objectWithString:jsonString error:nil];
    NSLog(@"%@",dict);


    NSDictionary *dict2;
    dict2 = [jsonString JSONValue];
    NSLog(@"%@",dict2);

   [parser release];

这是我的控制台输出:

2011-08-12 13:56:55.098 EasyQuiz[5446:13603] [
"q": "Question Testing", 
"score": 1, 
"c3": "Choice C", 
"c2": "Choice B", 
"c1": "Choice A", 
"rev": 1, 
"id": 1, 
"c4": "Choice D"
]
2011-08-12 13:56:55.686 EasyQuiz[5446:13603] (null)
2011-08-12 13:56:56.296 EasyQuiz[5446:13603] -JSONValue failed. Error is: Illegal start  
of token []
2011-08-12 13:56:56.297 EasyQuiz[5446:13603] (null)

我检查了http://jsonformatter.curiousconcept.com/ 的字符串,它似乎是有效的。你认为是什么导致了这个问题?谢谢!

我在 dict = [parser objectWithString:jsonString error:nil]; 中打印了错误它说:

  Error Domain=org.brautaset.SBJsonParser.ErrorDomain Code=0 "Illegal start of token []" 
  UserInfo=0x62eb920 NSLocalizedDescription=Illegal start of token []

编辑 我尝试像这样对 jsonstring 进行硬编码

NSString *thisJsonString = @"[\"q\": \"Question Testing\",\"score\": 1, \"c3\": \"Choice C\", \"c2\": \"Choice B\", \"c1\": \"Choice A\", \"rev\": 1, \"id\": 1, \"c4\": \"Choice D\"]";

SBJsonParser *parser = [[SBJsonParser alloc] init];

NSDictionary *dict;

dict = [parser objectWithString:thisJsonString error:nil];
NSLog(@"dict %@",dict);

[parser release];

我在控制台中得到了我想要的:

dict (
    
    c1 = "Choice A";
    c2 = "Choice B";
    c3 = "Choice C";
    c4 = "Choice D";
    id = 1;
    q = "Question Testing";
    rev = 1;
    score = 1;

)

编辑 如果你想知道我从哪里得到数据。我使用 asihttprequest 从网站下载了一个 zip 文件,并使用 Objective-zip 提取了该文件,并且提取的文件是这样读取的。

NSString *filePath = [[self applicationDocumentsDirectory]  
stringByAppendingPathComponent:@"json.zip"];

    //Opening zip file for reading...
    progressLabel.text = @"Reading file...";
    ZipFile *unzipFile= [[ZipFile alloc] initWithFileName:filePath mode:ZipFileModeUnzip];

    //Opening first file...
    progressLabel.text = @"Opening file...";
    [unzipFile goToFirstFileInZip];
    ZipReadStream *read1= [unzipFile readCurrentFileInZip];

    //Reading from first file's stream...
    NSMutableData *data1= [[[NSMutableData alloc] initWithLength:1000000] autorelease];//100MB
    int bytesRead1= [read1 readDataWithBuffer:data1];
    NSLog(@"bytes: %d",bytesRead1);
    if (bytesRead1 > 0) 
        progressLabel.text = @"File is good!";
        jsonString = [[[NSString alloc] initWithData:data1 encoding:NSUTF8StringEncoding] autorelease];
//.... more codes follow, but this is how I get jsonString

【问题讨论】:

我不确定出了什么问题,但这不是字典,而是数组 我不确定我是否理解正确,但我使用此代码将该 json 字符串转换为使用此代码的 nsdictionary。这段代码在我所有的其他类中都可以正常工作。只是这个提要给了我错误。 SBJsonParser *parser = [[SBJsonParser alloc] init]; NSDictionary *dict; dict = [parser objectWithString:jsonString error:nil]; NSLog(@"%@",dict); 如果字符串是数组,则不能强制将其转换为字典。看看JSON standard -- JSON 中的“object”是一个 NSDictionary 但“array”是 NSArray/ 【参考方案1】:

您的 json 是一个对象的数组,因此您不能直接将其解析为 NSDictionary。首先将其解析为 NSArray,然后将第一个对象放入 NSDictionary

-(void)parseJsonString


   NSArray *jsonArray = (*NSArray)[jsonString JSONValue];

   NSDictionary *jsonDict = [jsonArray objectAtIndex:0];

   NSString *q = [jsonDict objectForKey:@"q"];
   ...


【讨论】:

我收到此错误:-JSONValue 失败。错误是:令牌 [] 的非法开始,当 nslog 字符串时,我得到了这个。 (null) 我得到同样的错误。 NSString 没有收到 -JSONValue 消息。 想通了。如果您收到 -JSONValue failed 消息,则说明您没有使用 NSString+SBJSON.h 类别。原始问题作者确实指定他正在使用 SBJSON 项目。【参考方案2】:

objectWithString:error: 有返回类型id,修改你的代码如下,让我知道。

    NSString *str = [NSString stringWithFormat:@"%@", [parser objectWithString:jsonString error:nil]]; 
    NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:str,@"response", nil];
    NSLog(@"%@",[dict description]);

【讨论】:

我得到这个异常:异常被捕获:NSException - [<__nsdictionary0> setValue:forUndefinedKey:]:这个类不符合键值编码的键响应。 我明白了: response = "(null)"; :-( 我已经检查了我拥有的 URL,它向我展示了 NSDictionary 包含的一个对象,这就是我编辑代码的原因。让我用你的 JSON 字符串检查一下。我会告诉你的。 它正在响应我以下值,"(\n \n c1 = \"Choice A\";\n c2 = \"Choice B\";\n c3 = \"选择 C\";\n c4 = \"选择 D\";\n id = 1;\n q = \"问题测试\";\n rev = 1;\n score = 1;\n \n) "; 是 \n 导致了问题?

以上是关于无法将 json 字符串解析为 nsdictionary的主要内容,如果未能解决你的问题,请参考以下文章

Realm create() 无法将 JSON 字符串解析为 NSDate?

PHP - xml到json转换:“无法将字符串解析为XML”

PHP - xml 到 json 的转换:“字符串无法解析为 XML”

C# |从 URL 抓取 JSON 无法将字符串转换为 int

使用 NSJSONSerialization 解析 twitter 搜索 json 数据

解析 JSON 数据时无法将字符串附加到数组