由于第三方的JSONKit 有内容泄漏,故自己重新写JSON解析,用系统自带的NSJSONSerialization写(适用IOS5以上)更加高效和方便 ,形式参考JSONKit,这样就不用去改动工程的代码。直接上代码
//
// HMJSONKit.h
// CaiYun
//
// Created by lgqyhm on 14-1-3.
//
//
#import <Foundation/Foundation.h>
@interface HMJSONKit : NSObject
@end
#pragma mark Deserializing methods
#define KJsonkit
#ifdef KJsonkit
@interface NSString (HMJSONKitDeserializing)
- (id)objectFromJSONString;
//- (id)objectFromJSONStringWithParseOptions:(JKParseOptionFlags)parseOptionFlags;
//- (id)objectFromJSONStringWithParseOptions:(JKParseOptionFlags)parseOptionFlags error:(NSError **)error;
//- (id)mutableObjectFromJSONString;
//- (id)mutableObjectFromJSONStringWithParseOptions:(JKParseOptionFlags)parseOptionFlags;
//- (id)mutableObjectFromJSONStringWithParseOptions:(JKParseOptionFlags)parseOptionFlags error:(NSError **)error;
@end
@interface NSData (HMJSONKitDeserializing)
// The NSData MUST be UTF8 encoded JSON.
- (id)objectFromJSONData;
//- (id)objectFromJSONDataWithParseOptions:(JKParseOptionFlags)parseOptionFlags;
//- (id)objectFromJSONDataWithParseOptions:(JKParseOptionFlags)parseOptionFlags error:(NSError **)error;
//- (id)mutableObjectFromJSONData;
//- (id)mutableObjectFromJSONDataWithParseOptions:(JKParseOptionFlags)parseOptionFlags;
//- (id)mutableObjectFromJSONDataWithParseOptions:(JKParseOptionFlags)parseOptionFlags error:(NSError **)error;
@end
#pragma mark Serializing methods
@interface NSString (HMJSONKitSerializing)
// Convenience methods for those that need to serialize the receiving NSString (i.e., instead of having to serialize a NSArray with a single NSString, you can "serialize to JSON" just the NSString).
// Normally, a string that is serialized to JSON has quotation marks surrounding it, which you may or may not want when serializing a single string, and can be controlled with includeQuotes:
// includeQuotes:YES `a "test"...` -> `"a \"test\"..."`
// includeQuotes:NO `a "test"...` -> `a \"test\"...`
- (NSData *)JSONData; // Invokes JSONDataWithOptions:JKSerializeOptionNone includeQuotes:YES
//- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions includeQuotes:(BOOL)includeQuotes error:(NSError **)error;
- (NSString *)JSONString; // Invokes JSONStringWithOptions:JKSerializeOptionNone includeQuotes:YES
//- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions includeQuotes:(BOOL)includeQuotes error:(NSError **)error;
@end
@interface NSArray (HMJSONKitSerializing)
- (NSData *)JSONData;
//- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions error:(NSError **)error;
//- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingDelegate:(id)delegate selector:(SEL)selector error:(NSError **)error;
- (NSString *)JSONString;
//- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions error:(NSError **)error;
//- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingDelegate:(id)delegate selector:(SEL)selector error:(NSError **)error;
@end
@interface NSDictionary (HMJSONKitSerializing)
- (NSData *)JSONData;
//- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions error:(NSError **)error;
//- (NSData *)JSONDataWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingDelegate:(id)delegate selector:(SEL)selector error:(NSError **)error;
- (NSString *)JSONString;
//- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions error:(NSError **)error;
//- (NSString *)JSONStringWithOptions:(JKSerializeOptionFlags)serializeOptions serializeUnsupportedClassesUsingDelegate:(id)delegate selector:(SEL)selector error:(NSError **)error;
@end
#endif
//
// HMJSONKit.m
// CaiYun
//
// Created by lgqyhm on 14-1-3.
//
//
#import "HMJSONKit.h"
#ifdef KJsonkit
NSString *const DeserializeFailed = @"Deserialize Failed";
NSString *const SerializedFailed = @"Serialized Failed";
BOOL HMJSONKitValidation(id object)
{
if (![NSJSONSerialization isValidJSONObject:object])
{
[NSException raise:DeserializeFailed format:@"check the string"];
return NO;
}
return YES;
}
id HMJSONKitDeSerializeObjectWithData(NSData *data)
{
// if (!HMJSONKitValidation(data))
// return nil;
//
NSError *error;
id JSONObject = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
if (!JSONObject)
{
[NSException raise:DeserializeFailed format:@"Error: %@", error];
}
return JSONObject;
}
NSData *HMJSONKitSerializeObject(id object)
{
if (!HMJSONKitValidation(object))
return nil;
NSError *error;
NSData *data = [NSJSONSerialization dataWithJSONObject:object options:0 error:&error];
if (!data)
{
[NSException raise:DeserializeFailed format:@"Error: %@", error];
}
return data;
}
#pragma mark - Deserialization
@implementation NSString (HMJSONKitDeserializing)
- (id)objectFromJSONString
{
NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding];
return HMJSONKitDeSerializeObjectWithData(data);
}
@end
@implementation NSData (HMJSONKitDeserializing)
- (id)objectFromJSONData
{
return HMJSONKitDeSerializeObjectWithData(self);
}
@end
#pragma mark - Serialization
@implementation NSString (HMJSONKitSerializing)
- (NSData *)JSONData
{
return HMJSONKitSerializeObject(self);
}
// 没用到,很奇怪,为啥是 string 了还要进行转换
- (NSString *)JSONString
{
NSData *data = HMJSONKitSerializeObject(self);
NSString *JSONString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
return [JSONString autorelease];
}
@end
@implementation NSArray (HMJSONKitSerializing)
- (NSData *)JSONData
{
return HMJSONKitSerializeObject(self);
}
- (NSString *)JSONString
{
NSData *data = HMJSONKitSerializeObject(self);
NSString *JSONString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
return [JSONString autorelease];
}
@end
@implementation NSDictionary (HMJSONKitSerializing)
- (NSData *)JSONData
{
return HMJSONKitSerializeObject(self);
}
- (NSString *)JSONString
{
NSData *data = HMJSONKitSerializeObject(self);
NSString *JSONString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
return [JSONString autorelease];
}
@end
#endif