Ios 在DetailViewController中将JSON字符串转换为NSDictionary
试图找出为什么从tableviewcontroller到detailviewcontroller的json序列不起作用。做了一个NSLog以查看数据是否通过,这是dvc中显示的Ios 在DetailViewController中将JSON字符串转换为NSDictionary,ios,json,uitableview,nsdictionary,nsdata,Ios,Json,Uitableview,Nsdictionary,Nsdata,试图找出为什么从tableviewcontroller到detailviewcontroller的json序列不起作用。做了一个NSLog以查看数据是否通过,这是dvc中显示的 "data.detail" NSLog: ( { emails = { 10 = j; 11 = k; 12 = l; 9 = i; }; li
"data.detail" NSLog:
(
{
emails = {
10 = j;
11 = k;
12 = l;
9 = i;
};
links = {
1 = a;
2 = b;
3 = c;
4 = d;
};
location = {
13 = m;
14 = n;
15 = o;
16 = p;
};
numbers = {
5 = e;
6 = f;
7 = g;
8 = h;
};
}
)
然后我
尝试将json数据转换为detailviewcontroller中的tableview
NSString *rawString = [NSString stringWithFormat:@"%@", data.detail];
NSString *jsonString = rawString;
NSData *JSONdata = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
NSError *jsonError = nil;
但将JSON转换为NSData后,NSDictionary只在NSLog中输出“null”
NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:JSONdata options:0 error:&jsonError];
NSArray *items = [dic valueForKeyPath:@"email"];
NSLog(@"dic %@", dic);
NSLog(@"items %@", items);
救命啊!非常感谢。您好,您的
JSON
无效,因此无法使用
首先来看一个JSON
的例子:
然后您可以在这里尝试您的JSON
:jsonlint.com
以下是格式良好的JSON
的开头:
{
"emails": {
"9": "i",
"10": "j",
"11": "k",
"12": "l"
},
"links": {
"1": "a",
"2": "b",
"3": "c",
"4": "d"
}
}
主要将=
改为:
和代码>到,
并添加了一些“
祝你好运。在代码行下面更改
NSArray *items = [dic valueForKeyPath:@"email"];
到
如果仍然得到nslog nil,则更改
NSString *rawString = [NSString stringWithFormat:@"%@", data.detail];
喜欢这个
NSString *rawString = @"{\"emails\" :{\"10\" : \"j\",\"11\" : \"k\",\"12\" : \"l\",\"9\" : \"i\"},\"links\" :{\"1\" : \"a\",\"2\" : \"b\",\"3\" : \"c\",\"4\" : \"d\"}}";
有两种可能,但您没有显示足够的信息:
data.detail都是一个NSString。在这种情况下,这行代码完全没有用处,因为它只是制作字符串副本的一种昂贵的方法,而该字符串根本不包含任何JSON
或者data.detail是一个NSDictionary。在这种情况下,您的整个代码完全是误入歧途的废话,因为在这种情况下,您有一个NSDictionary,尝试将它转换为一个JSON字符串,使用不起作用的代码,将该字符串转换为NSData,然后将NSData转换回字典,这就是您的起点
纯粹出于病态的好奇,是哪一个?你确定json语法正确吗?它以“(”开头,以“)”结尾,对吗?我还更改了json并添加了“[”和“]“查看是否可以工作但仍然为null。data.detail不是有效的JSON。不要使用valueForKeyPath,而是使用objectForKey,它的速度是valueForKeyPath的十倍,而且与valueForKeyPath不同,它总是可以工作的。创建原始字符串的方式相当愚蠢。你为什么不直接使用data.detail呢?你最好的朋友在这里:谢谢你,你发布的rawsting格式很有帮助,这是我的修正。
NSString *rawString = @"{\"emails\" :{\"10\" : \"j\",\"11\" : \"k\",\"12\" : \"l\",\"9\" : \"i\"},\"links\" :{\"1\" : \"a\",\"2\" : \"b\",\"3\" : \"c\",\"4\" : \"d\"}}";
NSString *rawString = [NSString stringWithFormat:@"%@", data.detail];