如何将 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?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 JSON 转换为 SQL 查询 - php

Python Flask:如何将字典对象转换为 json? [复制]

如何在 Spark 2 Scala 中将 Row 转换为 json

java将JSON字符串转换为实体类对象,基于net sf json实现

需要基于 xml-mapping 将 POJO 转换为 XML 和 JSON 的工具

基于Reflect将List泛型数据源转换为Json字符串