从保管箱 iOS 读取 JSON 文件
Reading JSON file from dropbox iOS
我有一个应用程序从服务器 (dropbox) 读取文件并检查版本的场景。如果有新版本可用,请下载该应用程序。
我正在尝试从 link 读取文件,但在 JSON 解析后得到 null
。
NSError *error;
NSString *strFileContent = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"https://www.dropbox.com/s/22mm417fxdqdn8c/FileStructure.txt?dl=0"]
encoding:NSUTF8StringEncoding
error:&error];
if(!error) { //Handle error
// NSLog(@"strFileContent: %@",strFileContent);
NSData *data = [strFileContent dataUsingEncoding:NSUTF8StringEncoding];
id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSLog(@"json : %@",[json description]);
}
else
NSLog(@"Error in reading!");
}
DropBox 的任何替代品?
这不是包含 JSON 的文本文件;它是一个包含 JSON 的 RTF 文件。这不适用于 NSJSONSerialization
:
{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
\paperw11900\paperh16840\margl1440\margr1440\vieww10800\viewh8400\viewkind0
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural
\f0\fs24 \cf0 \{\
"Version": 1.0,\
"ImageList": [\
"Nature.png",\
"Nature-1.png",\
"Ballon.png"\
]\
\}}
您已使用使用 RTF(默认 Mac TextEdit
)的编辑器保存了该文件。您需要重新另存为纯文本。
假设 URL 也不正确。如果您只需要文件内容,则必须设置 dl=1(url 的最后一个组成部分)。像这样-
有一个方法,我觉得很丑,但还是。
第一期,正如其他人提到的:yourURLEtcdl=1
.
第二个大问题,该文件是一个 rtf 文件,而不是 JSON 对象。
所以,既然有一种方法可以使用 RTF => NSAttributedString => NSString => "JSON" => 得到你想要的值,你可以这样做:
NSError *error;
NSURL *url = [NSURL URLWithString:@"https://www.dropbox.com/s/22mm417fxdqdn8c/FileStructure.txt?dl=1"];
NSString *strFileContent = [NSString stringWithContentsOfURL:url
encoding:NSUTF8StringEncoding
error:&error];
NSLog(@"strFileContent: %@", strFileContent);
if(!error)
{
NSError *rtfError;
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithData:[strFileContent dataUsingEncoding:NSUTF8StringEncoding]
options:@{NSDocumentTypeDocumentAttribute:NSRTFTextDocumentType} documentAttributes:nil
error:&rtfError];
if (rtfError)
{
NSLog(@"RTFError: %@", [rtfError localizedDescription]);
}
else
{
NSLog(@"string: %@", [attributedString string]);
NSData *data = [[attributedString string] dataUsingEncoding:NSUTF8StringEncoding];
NSError *jsonError;
NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError];
if (jsonError)
{
NSLog(@"JSON Error: %@", [jsonError localizedDescription]);
}
else
{
NSLog(@"JSON: %@", jsonDict);
NSInteger version = [[jsonDict objectForKey:@"Version"] integerValue];
NSLog(@"Version: %ld", (long)version);
}
}
}
else
{
NSLog(@"Error: %@", error);
}
正如我所说,我觉得这些不是很好,但它有效,但这个解决方案在我看来相当混乱(通过 NSData
两次)。
我有一个应用程序从服务器 (dropbox) 读取文件并检查版本的场景。如果有新版本可用,请下载该应用程序。
我正在尝试从 link 读取文件,但在 JSON 解析后得到 null
。
NSError *error;
NSString *strFileContent = [NSString stringWithContentsOfURL:[NSURL URLWithString:@"https://www.dropbox.com/s/22mm417fxdqdn8c/FileStructure.txt?dl=0"]
encoding:NSUTF8StringEncoding
error:&error];
if(!error) { //Handle error
// NSLog(@"strFileContent: %@",strFileContent);
NSData *data = [strFileContent dataUsingEncoding:NSUTF8StringEncoding];
id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
NSLog(@"json : %@",[json description]);
}
else
NSLog(@"Error in reading!");
}
DropBox 的任何替代品?
这不是包含 JSON 的文本文件;它是一个包含 JSON 的 RTF 文件。这不适用于 NSJSONSerialization
:
{\rtf1\ansi\ansicpg1252\cocoartf1347\cocoasubrtf570
{\fonttbl\f0\fswiss\fcharset0 Helvetica;}
{\colortbl;\red255\green255\blue255;}
\paperw11900\paperh16840\margl1440\margr1440\vieww10800\viewh8400\viewkind0
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\pardirnatural
\f0\fs24 \cf0 \{\
"Version": 1.0,\
"ImageList": [\
"Nature.png",\
"Nature-1.png",\
"Ballon.png"\
]\
\}}
您已使用使用 RTF(默认 Mac TextEdit
)的编辑器保存了该文件。您需要重新另存为纯文本。
假设 URL 也不正确。如果您只需要文件内容,则必须设置 dl=1(url 的最后一个组成部分)。像这样-
有一个方法,我觉得很丑,但还是。
第一期,正如其他人提到的:yourURLEtcdl=1
.
第二个大问题,该文件是一个 rtf 文件,而不是 JSON 对象。
所以,既然有一种方法可以使用 RTF => NSAttributedString => NSString => "JSON" => 得到你想要的值,你可以这样做:
NSError *error;
NSURL *url = [NSURL URLWithString:@"https://www.dropbox.com/s/22mm417fxdqdn8c/FileStructure.txt?dl=1"];
NSString *strFileContent = [NSString stringWithContentsOfURL:url
encoding:NSUTF8StringEncoding
error:&error];
NSLog(@"strFileContent: %@", strFileContent);
if(!error)
{
NSError *rtfError;
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithData:[strFileContent dataUsingEncoding:NSUTF8StringEncoding]
options:@{NSDocumentTypeDocumentAttribute:NSRTFTextDocumentType} documentAttributes:nil
error:&rtfError];
if (rtfError)
{
NSLog(@"RTFError: %@", [rtfError localizedDescription]);
}
else
{
NSLog(@"string: %@", [attributedString string]);
NSData *data = [[attributedString string] dataUsingEncoding:NSUTF8StringEncoding];
NSError *jsonError;
NSDictionary *jsonDict = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError];
if (jsonError)
{
NSLog(@"JSON Error: %@", [jsonError localizedDescription]);
}
else
{
NSLog(@"JSON: %@", jsonDict);
NSInteger version = [[jsonDict objectForKey:@"Version"] integerValue];
NSLog(@"Version: %ld", (long)version);
}
}
}
else
{
NSLog(@"Error: %@", error);
}
正如我所说,我觉得这些不是很好,但它有效,但这个解决方案在我看来相当混乱(通过 NSData
两次)。