Posts tagged ‘NSDictionary’

iPhone上的JSON(二)

上一期基本上讨论了Objc的JSON框架的原理,现在简单介绍一下使用。

在CS193P的课堂程序上,列出了以下函数:

+ (id)fetchJSONValueForURL:(NSURL *)url
{
    NSString *jsonString = [[NSString alloc] initWithContentsOfURL:url
                                                          encoding:NSUTF8StringEncoding error:nil];
 
    id jsonValue = [jsonString JSONValue];
    [jsonString release];
    return jsonValue;
}

基本上这个函数方法就是将一个传入的互联网地址,当然是一个.json文件的位置。然后传出的就是一个NSDictionary~

我在使用的时候,写了一个方法来调用它:

+ (NSDictionary *)fetchLibraryInformation
{
    NSString *urlString = [NSString stringWithFormat:@"http://gzl.name/appData/MyFodian/Lib/main.json"];
    NSURL *url = [NSURL URLWithString:urlString];
	NSLog(@"fetching library data");
    return [self fetchJSONValueForURL:url];
}

这个方法不过是将我存放json文件的地址告诉了前面的方法,然后返回这个NSDictionary,这回的返回值我用得NSDictionary,其实和id在这里没有区别。记得在使用这个对象的时候还要retain一下,否则一会儿就没有咯。因为JSONValue方法返回的应该是一个autorelease对象。

接下来我们就可以使用这个NSDictionary中的数据拉!

第一期请参看iPhone上的JSON

iPhone上的JSON

JSON我就不多解释了,需要更多信息的朋友请到json.org上查看。

在iPhone上访问网络内容是很必须的,而一些数据就需要以某种形式储存在web服务器上。比如一个app的目录,内容,索引等等。而xml和json,plist都是比较方便的方式。

-XML在iPhone上是非常好用的,但是对复杂的数据结构使用上就不那么方便了,具体可以参阅苹果的“基于事件的XML”和“基于树的XML”编程向导

-plist是再方便不过了,不过我看最多也就是一个NSDictionary而已,复杂一些的话,数据输入上也会非常非常的麻烦。

-JSON本来是不被苹果支持的,但是有人很Nice的帮我们解决了这个问题:JSON for OBJC http://code.google.com/p/json-framework/

基本上来说,这个框架异常的简单易用,会将得到的json字符串处理成一个复杂NSDictionary对象,而每一个值都还是一个NSDictionary对象

比如:

{
	"华藏净宗学会":
	{
		"zhaomu":
		{
			"name":"净宗朝暮课本",
			"length":142,
			"digits":3
		},
		"kesong":
		{
			"name":"净宗共修课本",
			"length":75,
			"digits":2
		}
	},
	"生命基金会":
	{
		"dabei88":
		{
			"name":"大悲出相图",
			"length":88,
			"digits":2
		}
	}
}

就会转换为一个复杂无比的NSDictionary:

[[NSDictionary alloc] 
 initWithObjects:[NSArray 
		  arrayWithObjects:
		  [NSDictionary 
		   dictionaryWithObjects:[NSArray 
				  arrayWithObjects:
				  [NSDictionary 
				   dictionaryWithObjects:[NSArray 
						  arrayWithObjects:
							  @"净宗朝暮课本",
							  @"142",
							  @"3",nil] 
				   forKeys:
				   [NSArray arrayWithObjects:
				   @"name",
				   @"length",
				   @"digits",nil]],
				  [NSDictionary 
				   dictionaryWithObjects:[NSArray 
						  arrayWithObjects:
						  @"净宗共修课本",
						  @"75",
						  @"2",nil] 
				   forKeys:
				   [NSArray arrayWithObjects:
				   @"name",
				   @"length",
				   @"digits",nil]],nil]
		   forKeys:[NSArray arrayWithObjects:@"zhaomu",@"kesong",nil]],
		  [NSDictionary 
		   dictionaryWithObjects:[NSArray 
				  arrayWithObjects:
				  [NSDictionary 
				   dictionaryWithObjects:[NSArray 
						  arrayWithObjects:
						  @"大悲出相图",
						  @"88",
						  @"2",nil] 
				   forKeys:
				   [NSArray arrayWithObjects:
				   @"name",
				   @"length",
				   @"digits",nil]],nil]
		   forKeys:[NSArray arrayWithObjects:@"dabei88",nil]],nil]
 forKeys:[NSArray arrayWithObjects:@"华藏净宗学会",@"生命基金会",nil]];

我是非常佩服自己能打出来上面的巨大无比的定义式。。。。没有编译错误

不管怎么样,转换后,在系统中就可以非常方便的使用json的键值结构信息咯~!!!