如何将 UTF8String 转换为基于 JSON 的 NSDictionary?
Posted
技术标签:
【中文标题】如何将 UTF8String 转换为基于 JSON 的 NSDictionary?【英文标题】:How to convert UTF8String to JSON based NSDictionary? 【发布时间】:2013-09-24 14:55:44 【问题描述】:我收到了一个 JSON 格式的 Web 服务响应。这是 UTF8String 基本响应字符串:
"\"ApplicationId\":1,\"CurrentPosition\":0,\"EndOfFile\":false,\"Media\":\"Active\":true,\"Description\":\"This video demonstrates a quick overview of Bentley LEARN Server.\",\"LocationId\":1,\"MP4URL\":\"http:\\/\\/cdnllnw.bentley.com\\/s\\/LearnVideo\\/Welcome.mp4?s=1380034262&e=1380077462&h=c2641922fd862ffe5c5a05e94786359a\",\"MediaId\":5003235,\"MediaURL\":\"http:\\/\\/cdnllnw.bentley.com\\/s\\/LearnVideo\\/Welcome.mp4?s=1380034262&e=1380077462&h=c2641922fd862ffe5c5a05e94786359a\",\"StreamServer\":null,\"Title\":\"Welcome\",\"TransferStatus\":0,\"filesize\":9094429,\"MediaDuration\":0,\"SkippedCurrentPosition\":0,\"UserBP\":8011512,\"ViewedTime\":0"
格式化后的样子:
"ApplicationId":1,
"CurrentPosition":0,
"EndOfFile":false,
"Media":
"Active":true,
"Description":"This video demonstrates a quick overview of Bentley LEARN Server.",
"LocationId":1,
"MP4URL":"http:\/\/cdnllnw.bentley.com\/s\/LearnVideo\/Welcome.mp4?s=1380035311&e=1380078511&h=d8de8ade046266fb7324be90a575f978",
"MediaId":5003235,
"MediaURL":"http:\/\/cdnllnw.bentley.com\/s\/LearnVideo\/Welcome.mp4?s=1380035311&e=1380078511&h=d8de8ade046266fb7324be90a575f978",
"StreamServer":null,
"Title":"Welcome",
"TransferStatus":0,
"filesize":9094429
,
"MediaDuration":0,
"SkippedCurrentPosition":0,
"UserBP":8011512,
"ViewedTime":0
如何将此字符串转换为 JSON 对象或 NSDictionary 对象,以便轻松访问所有键值。
我试过这个:
NSString *responseString = [NSString stringWithUTF8String:response.c_str()];
NSDictionary *JSONdict =
[NSJSONSerialization JSONObjectWithData: [responseString dataUsingEncoding:NSUTF8StringEncoding]
options: NSJSONReadingMutableContainers
error: &error];
但它说 JSONdict 是 nil 并且错误描述是:
Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 3840.)" (JSON text did not start with array or object and option to allow fragments not set.) UserInfo=0xd8bbd30 NSDebugDescription=JSON text did not start with array or object and option to allow fragments not set.
请帮忙
【问题讨论】:
那么错误说明了什么?... Convert JSON feed to NSDictionary的可能重复 @GrzegorzKrukowski 添加了错误描述 @Rob:我正在使用相同的方法,但它仍然给我带来了错误。我知道我调用的方法是正确的,但是为什么它会抛出错误。 看起来不错。这个 NSString 来自哪里?您可以在创建此 NSString 的位置粘贴更多代码吗? 【参考方案1】:根据错误添加 NSJSONReadingAllowFragments 作为选项应该会有所帮助:
NSString* jsonString = @"\"ApplicationId\":1,\"CurrentPosition\":0,\"EndOfFile\":false,\"Media\":\"Active\":true,\"Description\":\"This video demonstrates a quick overview of Bentley LEARN Server.\",\"LocationId\":1,\"MP4URL\":\"http:\\/\\/cdnllnw.bentley.com\\/s\\/LearnVideo\\/Welcome.mp4?s=1380034262&e=1380077462&h=c2641922fd862ffe5c5a05e94786359a\",\"MediaId\":5003235,\"MediaURL\":\"http:\\/\\/cdnllnw.bentley.com\\/s\\/LearnVideo\\/Welcome.mp4?s=1380034262&e=1380077462&h=c2641922fd862ffe5c5a05e94786359a\",\"StreamServer\":null,\"Title\":\"Welcome\",\"TransferStatus\":0,\"filesize\":9094429,\"MediaDuration\":0,\"SkippedCurrentPosition\":0,\"UserBP\":8011512,\"ViewedTime\":0";
NSError* error = nil;
NSDictionary *JSONdict =
[NSJSONSerialization JSONObjectWithData: [responseString dataUsingEncoding:NSUTF8StringEncoding]
options: NSJSONReadingMutableContainers | NSJSONReadingAllowFragments
error: &error];
但这意味着您在问题中粘贴的 NSString 包含不遵循 JSON 格式的额外字符。如果您从获取此值的位置(文件、网络)添加更多代码 - 我可以提供更多帮助以使其有效。在此之前将此答案视为解决方法:)
格式正确的字符串应该是:
\"ApplicationId\":1,\"CurrentPosition\":0,\"EndOfFile\":false,\"Media\":\"Active\":true,\"Description\":\"This video demonstrates a quick overview of Bentley LEARN Server.\",\"LocationId\":1,\"MP4URL\":\"http:\\/\\/cdnllnw.bentley.com\\/s\\/LearnVideo\\/Welcome.mp4?s=1380034262&e=1380077462&h=c2641922fd862ffe5c5a05e94786359a\",\"MediaId\":5003235,\"MediaURL\":\"http:\\/\\/cdnllnw.bentley.com\\/s\\/LearnVideo\\/Welcome.mp4?s=1380034262&e=1380077462&h=c2641922fd862ffe5c5a05e94786359a\",\"StreamServer\":null,\"Title\":\"Welcome\",\"TransferStatus\":0,\"filesize\":9094429,\"MediaDuration\":0,\"SkippedCurrentPosition\":0,\"UserBP\":8011512,\"ViewedTime\":0
开头和结尾都没有 "。也许这就是原因。 如果您从 Web 加载此内容 - 请确保您没有包含任何 JS 或额外的标头,并确认您的 Web 服务以标头中的 JSON 格式响应。
【讨论】:
我已经尝试过该选项,但是当我尝试使用 NSLog(@"%@", [JSONdict objectForKey:@"Media"]);它说 -[__NSCFString objectForKey:]: unrecognized selector sent to instance 0xc69e3e0 嗯,这意味着您的 JSONdict 是 NSString 而不是 NSDictonary - 请回答我的问题,该问题来自该 NSString 的来源并粘贴更多代码。 我在答案中添加了 NSString 定义到代码中 - 请复制粘贴并查看它是否正常工作 - 您在其他地方有问题 - 不是在序列化中【参考方案2】:我已经尝试使用您的 NSString 和下一段代码(这是一个起点)从“媒体”输出字典;
NSString *string = @"\"ApplicationId\":1,\"CurrentPosition\":0,\"EndOfFile\":false,\"Media\":\"Active\":true,\"Description\":\"This video demonstrates a quick overview of Bentley LEARN Server.\",\"LocationId\":1,\"MP4URL\":\"http:\\/\\/cdnllnw.bentley.com\\/s\\/LearnVideo\\/Welcome.mp4?s=1380034262&e=1380077462&h=c2641922fd862ffe5c5a05e94786359a\",\"MediaId\":5003235,\"MediaURL\":\"http:\\/\\/cdnllnw.bentley.com\\/s\\/LearnVideo\\/Welcome.mp4?s=1380034262&e=1380077462&h=c2641922fd862ffe5c5a05e94786359a\",\"StreamServer\":null,\"Title\":\"Welcome\",\"TransferStatus\":0,\"filesize\":9094429,\"MediaDuration\":0,\"SkippedCurrentPosition\":0,\"UserBP\":8011512,\"ViewedTime\":0";
NSString *newString = [string stringByReplacingOccurrencesOfString:@"\\" withString:@""];
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:[newString dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingMutableLeaves error:nil];
NSLog(@"%@", [dictionary valueForKey:@"Media"]);
结果是:
Active = 1;
Description = "This video demonstrates a quick overview of Bentley LEARN Server.";
LocationId = 1;
MP4URL = "http://cdnllnw.bentley.com/s/LearnVideo/Welcome.mp4?s=1380034262&e=1380077462&h=c2641922fd862ffe5c5a05e94786359a";
MediaId = 5003235;
MediaURL = "http://cdnllnw.bentley.com/s/LearnVideo/Welcome.mp4?s=1380034262&e=1380077462&h=c2641922fd862ffe5c5a05e94786359a";
StreamServer = "<null>";
Title = Welcome;
TransferStatus = 0;
filesize = 9094429;
希望对你有用。
【讨论】:
以上是关于如何将 UTF8String 转换为基于 JSON 的 NSDictionary?的主要内容,如果未能解决你的问题,请参考以下文章
Python Flask:如何将字典对象转换为 json? [复制]
如何在 Spark 2 Scala 中将 Row 转换为 json
java将JSON字符串转换为实体类对象,基于net sf json实现