IOS - 如何将json字符串转换为对象
Posted
技术标签:
【中文标题】IOS - 如何将json字符串转换为对象【英文标题】:IOS - How to convert json string into object 【发布时间】:2016-05-06 04:41:03 【问题描述】:我是 ios 开发新手。我有一个看起来像的 json
"result":[]
"result":["alternative":["transcript":"free","confidence":0.63226712,"transcript":"we"],"final":true],"result_index":0
我的编码部分
- (BOOL)didReceiveVoiceResponse:(NSData *)data
// NSLog(@"data :%@",data);
// NSError *jsonError = nil;
////
NSString *responseString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"responseString: %@",responseString);
NSData *data1 = [responseString dataUsingEncoding:NSUTF8StringEncoding];
NSLog(@"data1: %@",data1);
NSData *data2 = [responseString dataUsingEncoding:NSUTF8StringEncoding];
id json = [NSJSONSerialization JSONObjectWithData:data2 options:0 error:nil];
NSLog(@"====%@",json);
NSLog(@"%@",[json objectForKey:@"result"]);
控制台日志
2016-05-06 09:55:34.909 SpeechToTextDemo[79631:2980023] responseString: "result":[]
"result":["alternative":["transcript":"free","confidence":0.63226712,"transcript":"we"],"final":true],"result_index":0
2016-05-06 09:55:34.909 SpeechToTextDemo[79631:2980023] data1: <7b227265 73756c74 223a5b5d 7d0a7b22 72657375 6c74223a 5b7b2261 6c746572 6e617469 7665223a 5b7b2274 72616e73 63726970 74223a22 66726565 222c2263 6f6e6669 64656e63 65223a30 2e363332 32363731 327d2c7b 22747261 6e736372 69707422 3a227765 227d5d2c 2266696e 616c223a 74727565 7d5d2c22 72657375 6c745f69 6e646578 223a307d 0a>
2016-05-06 09:55:34.909 SpeechToTextDemo[79631:2980023] ====(null)
2016-05-06 09:55:34.910 SpeechToTextDemo[79631:2980023] (null)
请在上面找到我的编码部分和控制台日志。请指导我如何解决这个想法。我想tanscript
值。如何获得这个值。谢谢
【问题讨论】:
使用error
参数。
"result":["alternative":["transcript":"free","confidence":0.63226712,"transcript":"we"],"final" :true],"result_index":0 是完整的响应字符串吗?
@pkt 谢谢。如何解决此错误。我想获取成绩单值
我认为您需要在键和值之前和之后添加“\”。喜欢这个***.com/questions/8606444/…。否则它不应该是一个 json 字符串
我已经检查了你的答案兄弟,但现在 json 和结果值仍将为空。
【参考方案1】:
您的回复不是正确的 json 格式。首先添加以下行以通过以下行删除多余的空结果字符串:
yourJsonString = [yourJsonString stringByReplacingOccurrencesOfString:@"\"result\":[]" withString:@""];
然后,试试下面的代码:
yourJsonString = [yourJsonString stringByReplacingOccurrencesOfString:@"\"result\":[]" withString:@""];
NSData* jsonData = [yourJsonString dataUsingEncoding:NSUTF8StringEncoding];
NSError *error = nil;
NSDictionary *responseObj = [NSJSONSerialization
JSONObjectWithData:jsonData
options:0
error:&error];
if(! error)
NSArray *responseArray = [responseObj objectForKey:@"result"];
for (NSDictionary *alternative in responseArray)
NSArray *altArray = [alternative objectForKey:@"alternative"];
for (NSDictionary *transcript in altArray)
NSLog(@"transcript : %@",[transcript objectForKey:@"transcript"]);
else
NSLog(@"Error in parsing JSON");
【讨论】:
不要只发布代码。说明问题中的代码有什么问题,并说明您的答案如何解决问题。 @Raj 只需添加 responseString = [responseString stringByReplacingOccurrencesOfString:@"\"result\":[]" withString:@""];从响应中删除额外的空结果字符串。然后将其转换为 NSData。 @Microprocessor8085 "result":["alternative":["transcript":"5","transcript":"v","transcript":"five" ],"final":true],"result_index":0 2016-05-06 11:16:50.493 SpeechToTextDemo[88576:3054271] 成绩单:5 非常感谢您的帮助。它对我有很大帮助。再次感谢。它会很好用。非常感谢【参考方案2】:使用此代码将帮助您转换响应字符串
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];
获取值后将接收到的值添加到字典中 然后根据您的需要使用它
【讨论】:
我已经添加了你的编码,但它仍然是 null @abhinandan 这没有帮助。 OP 已经有了NSData
。这不是问题。【参考方案3】:
NSData *data = [responseString dataUsingEncoding:NSUTF8StringEncoding];
NSLog(@"data1: %@",data);
NSError *error;
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
NSLog(@"Result = %@", dict);
if (error == nil)
if([dict valueForKey:@"result"])
NSLog(@"%@", [[dict valueForKey:@"result"] objectAtIndex:0]);
//you need to do loop to get all transcript data
//NSArray *array = [[[dict valueForKey:@"result"] objectAtIndex:0] valueForKey:@"alternative"];
NSString *transcript = [[[[[dict valueForKey:@"result"] objectAtIndex:0] valueForKey:@"alternative"] objectAtIndex:1] valueForKey:@"transcript"];
NSLog(@"transcript = %@", transcript);
else
NSLog(@"Error = %@",error);
希望对你有帮助。
【讨论】:
我已经添加了你的编码,但应用程序将被强制关闭@Richard 错误:SpeechToTextDemo[83330:3010284] *** 由于未捕获的异常“NSRangeException”而终止应用程序,原因:“*** -[__NSArrayM objectAtIndex:]:索引 0 超出空数组的范围” *** 首先抛出调用栈:( @Raj 请试试我的答案。 不要只发布代码。说明问题中的代码有什么问题,并说明您的答案如何解决问题。【参考方案4】:您的函数中已经有数据作为参数
那你为什么将它转换为字符串并再次转换回数据
- (BOOL)didReceiveVoiceResponse:(NSData *)data
// NSLog(@"data :%@",data);
// NSError *jsonError = nil;
NSError *error;
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
if (error == nil)
// no error
NSLog(@"====%@",json);
NSLog(@"%@",[json objectForKey:@"result"]);
else
NSLog(@"error");
【讨论】:
@ pkt 我已经测试了你的代码。但它仍然是空的。请指导 2016-05-06 10:41:15.858 SpeechToTextDemo[84733:3022050] ====(null) 2016-05-06 10:41:15.858 SpeechToTextDemo[84733:3022050] (null) 现在可能的问题是您的响应字符串【参考方案5】:试试这个可能对你有帮助-
NSData* jsonData = [yourJsonString dataUsingEncoding:NSUTF8StringEncoding];
NSError *error = nil;
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:&error];
NSLog(@"Result = %@", dict);
if(! error)
NSArray *Array1 = [dict objectForKey:@"result"];
//now you will go inside dict having key "result"
for (NSDictionary *dict2 in Array1)
NSArray *Array2 = [dict2 objectForKey:@"result"];
for (NSDictionary *dict3 in Array2)
NSArray *array3 = [dict3 objectForKey:@"alternative"]);
for(NSDictionary *dict4 in array3)
NSLog(@"transcript--",[dict4 objectForKey:@"transcript"]);
else
NSLog(@"Error");
【讨论】:
不要只发布代码。说明问题中的代码有什么问题,并说明您的答案如何解决问题。 我正在就如何发布有用的答案提供有用的建议。一个好的答案可以解释事情。它将更好地帮助您的答案的未来读者。通过写出更好的答案,您将获得更多的选票。【参考方案6】:您的 json 字符串格式不正确:
"result":[]
"result":["alternative":["transcript":"free","confidence":0.63226712, "transcript":"we"],"final":true],"result_index":0
这表明这两个项目应该在一个数组中,但是在你的json字符串中,它们是独立的。
[
"result":[],
"result":["alternative":["transcript":"free","confidence":0.63226712,"transcript":"we"],"final":true],"result_index":0
]
您的代码没问题,您可以将错误对象传递给[NSJSONSerialization JSONObjectWithData:data2 options:0 error:nil];
以了解问题所在。
【讨论】:
我已经测试过兄弟。它仍然是空的。我不知道如何解决这个问题。请指导【参考方案7】:iOS 和 Android 都必须使用对象类(模型类)生成器工具,只需复制并粘贴您的响应并从工具中获取对象类。
这是我对我的问题的重复答案,但它非常有用。visit my question here
从AppStore (Mac AppStore) 下载 JSON 加速器。从浏览器复制您的 JSON 响应。(响应必须经过 JSON 验证)。
粘贴到 Json 加速器中 >> 单击生成并使用您的模型名称保存。
选择输出语言并添加基类名称。(不需要类前缀) 见下文生成的模型类和子模型类(它会自动生成所有 JSON 对象类)这样使用>>> 例如,您的 JSON 响应字典是
"employees":[
"firstName":"John", "lastName":"Doe",
"firstName":"Anna", "lastName":"Smith",
"firstName":"Peter", "lastName":"Jones"
]
制作员工数组,然后使用创建的模型类创建对象,如下面的代码,您必须使用For loop
或enumerateObjectsUsingBlock
中的任何一个来创建,然后添加到可变数组中。
NSArray *arrTemp = [NSArray arrayWithArray:yourResponceDict[@"employees"]];
NSMutableArray *myMutableArray = [NSMutableArray array];
[arrTemp enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop)
Employee *aObj = [Employee modelObjectWithDictionary:obj];
[myMutableArray addObject:aObj];
];
此工具非常简单且省时,可用于创建 Json 对象类以在开发中的任何位置解析数据。
【讨论】:
我怀疑 OP 是否从浏览器获取 JSON 响应,或者他是否想将其粘贴到 mac 应用程序中。相反,他从后端 API 获取响应,他只是想将其解析为字典,然后在他的 iOS 应用程序中使用它。您的答案无效并且基于错误的假设 如有疑问,请向 OP 询问他在 cmets 部分的意图。 @NSNoob 我们必须在创建对象时第一次执行此过程。然后我们必须从创建的对象进行管理 不,您可以在应用程序中处理和管理它,而无需包含对浏览器、Mac OS 和外部工具的一些奇怪的不可行依赖。我不知道你为什么认为 iOS 应用程序是这样工作的【参考方案8】:试试这个代码
- (BOOL)didReceiveVoiceResponse:(NSData *)data
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:NULL];
NSLog(@"Dict=%@",dict);
【讨论】:
以上是关于IOS - 如何将json字符串转换为对象的主要内容,如果未能解决你的问题,请参考以下文章