214 lines
6.7 KiB
Mathematica
214 lines
6.7 KiB
Mathematica
|
/*
|
||
|
Copyright (C) 2007-2009 Stig Brautaset. All rights reserved.
|
||
|
|
||
|
Redistribution and use in source and binary forms, with or without
|
||
|
modification, are permitted provided that the following conditions are met:
|
||
|
|
||
|
* Redistributions of source code must retain the above copyright notice, this
|
||
|
list of conditions and the following disclaimer.
|
||
|
|
||
|
* Redistributions in binary form must reproduce the above copyright notice,
|
||
|
this list of conditions and the following disclaimer in the documentation
|
||
|
and/or other materials provided with the distribution.
|
||
|
|
||
|
* Neither the name of the author nor the names of its contributors may be used
|
||
|
to endorse or promote products derived from this software without specific
|
||
|
prior written permission.
|
||
|
|
||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
|
||
|
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||
|
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||
|
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||
|
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||
|
*/
|
||
|
|
||
|
#import "SBJSON.h"
|
||
|
|
||
|
@implementation SBJSON
|
||
|
|
||
|
- (id)init {
|
||
|
self = [super init];
|
||
|
if (self) {
|
||
|
jsonWriter = [SBJsonWriter new];
|
||
|
jsonParser = [SBJsonParser new];
|
||
|
[self setMaxDepth:512];
|
||
|
|
||
|
}
|
||
|
return self;
|
||
|
}
|
||
|
|
||
|
- (void)dealloc {
|
||
|
[jsonWriter release];
|
||
|
[jsonParser release];
|
||
|
[super dealloc];
|
||
|
}
|
||
|
|
||
|
#pragma mark Writer
|
||
|
|
||
|
|
||
|
- (NSString *)stringWithObject:(id)obj {
|
||
|
NSString *repr = [jsonWriter stringWithObject:obj];
|
||
|
if (repr)
|
||
|
return repr;
|
||
|
|
||
|
[errorTrace release];
|
||
|
errorTrace = [[jsonWriter errorTrace] mutableCopy];
|
||
|
return nil;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
Returns a string containing JSON representation of the passed in value, or nil on error.
|
||
|
If nil is returned and @p error is not NULL, @p *error can be interrogated to find the cause of the error.
|
||
|
|
||
|
@param value any instance that can be represented as a JSON fragment
|
||
|
@param allowScalar wether to return json fragments for scalar objects
|
||
|
@param error used to return an error by reference (pass NULL if this is not desired)
|
||
|
|
||
|
@deprecated Given we bill ourselves as a "strict" JSON library, this method should be removed.
|
||
|
*/
|
||
|
- (NSString*)stringWithObject:(id)value allowScalar:(BOOL)allowScalar error:(NSError**)error {
|
||
|
|
||
|
NSString *json = allowScalar ? [jsonWriter stringWithFragment:value] : [jsonWriter stringWithObject:value];
|
||
|
if (json)
|
||
|
return json;
|
||
|
|
||
|
[errorTrace release];
|
||
|
errorTrace = [[jsonWriter errorTrace] mutableCopy];
|
||
|
|
||
|
if (error)
|
||
|
*error = [errorTrace lastObject];
|
||
|
return nil;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
Returns a string containing JSON representation of the passed in value, or nil on error.
|
||
|
If nil is returned and @p error is not NULL, @p error can be interrogated to find the cause of the error.
|
||
|
|
||
|
@param value any instance that can be represented as a JSON fragment
|
||
|
@param error used to return an error by reference (pass NULL if this is not desired)
|
||
|
|
||
|
@deprecated Given we bill ourselves as a "strict" JSON library, this method should be removed.
|
||
|
*/
|
||
|
- (NSString*)stringWithFragment:(id)value error:(NSError**)error {
|
||
|
return [self stringWithObject:value
|
||
|
allowScalar:YES
|
||
|
error:error];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
Returns a string containing JSON representation of the passed in value, or nil on error.
|
||
|
If nil is returned and @p error is not NULL, @p error can be interrogated to find the cause of the error.
|
||
|
|
||
|
@param value a NSDictionary or NSArray instance
|
||
|
@param error used to return an error by reference (pass NULL if this is not desired)
|
||
|
*/
|
||
|
- (NSString*)stringWithObject:(id)value error:(NSError**)error {
|
||
|
return [self stringWithObject:value
|
||
|
allowScalar:NO
|
||
|
error:error];
|
||
|
}
|
||
|
|
||
|
#pragma mark Parsing
|
||
|
|
||
|
- (id)objectWithString:(NSString *)repr {
|
||
|
id obj = [jsonParser objectWithString:repr];
|
||
|
if (obj)
|
||
|
return obj;
|
||
|
|
||
|
[errorTrace release];
|
||
|
errorTrace = [[jsonParser errorTrace] mutableCopy];
|
||
|
|
||
|
return nil;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
Returns the object represented by the passed-in string or nil on error. The returned object can be
|
||
|
a string, number, boolean, null, array or dictionary.
|
||
|
|
||
|
@param value the json string to parse
|
||
|
@param allowScalar whether to return objects for JSON fragments
|
||
|
@param error used to return an error by reference (pass NULL if this is not desired)
|
||
|
|
||
|
@deprecated Given we bill ourselves as a "strict" JSON library, this method should be removed.
|
||
|
*/
|
||
|
- (id)objectWithString:(id)value allowScalar:(BOOL)allowScalar error:(NSError**)error {
|
||
|
|
||
|
id obj = allowScalar ? [jsonParser fragmentWithString:value] : [jsonParser objectWithString:value];
|
||
|
if (obj)
|
||
|
return obj;
|
||
|
|
||
|
[errorTrace release];
|
||
|
errorTrace = [[jsonParser errorTrace] mutableCopy];
|
||
|
|
||
|
if (error)
|
||
|
*error = [errorTrace lastObject];
|
||
|
return nil;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
Returns the object represented by the passed-in string or nil on error. The returned object can be
|
||
|
a string, number, boolean, null, array or dictionary.
|
||
|
|
||
|
@param repr the json string to parse
|
||
|
@param error used to return an error by reference (pass NULL if this is not desired)
|
||
|
|
||
|
@deprecated Given we bill ourselves as a "strict" JSON library, this method should be removed.
|
||
|
*/
|
||
|
- (id)fragmentWithString:(NSString*)repr error:(NSError**)error {
|
||
|
return [self objectWithString:repr
|
||
|
allowScalar:YES
|
||
|
error:error];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
Returns the object represented by the passed-in string or nil on error. The returned object
|
||
|
will be either a dictionary or an array.
|
||
|
|
||
|
@param repr the json string to parse
|
||
|
@param error used to return an error by reference (pass NULL if this is not desired)
|
||
|
*/
|
||
|
- (id)objectWithString:(NSString*)repr error:(NSError**)error {
|
||
|
return [self objectWithString:repr
|
||
|
allowScalar:NO
|
||
|
error:error];
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
#pragma mark Properties - parsing
|
||
|
|
||
|
- (unsigned int)maxDepth {
|
||
|
return [jsonParser maxDepth];
|
||
|
}
|
||
|
|
||
|
- (void)setMaxDepth:(unsigned int)d {
|
||
|
[jsonWriter setMaxDepth:d];
|
||
|
[jsonParser setMaxDepth:d];
|
||
|
}
|
||
|
|
||
|
|
||
|
#pragma mark Properties - writing
|
||
|
|
||
|
- (BOOL)humanReadable {
|
||
|
return jsonWriter.humanReadable;
|
||
|
}
|
||
|
|
||
|
- (void)setHumanReadable:(BOOL)x {
|
||
|
jsonWriter.humanReadable = x;
|
||
|
}
|
||
|
|
||
|
- (BOOL)sortKeys {
|
||
|
return jsonWriter.sortKeys;
|
||
|
}
|
||
|
|
||
|
- (void)setSortKeys:(BOOL)x {
|
||
|
jsonWriter.sortKeys = x;
|
||
|
}
|
||
|
|
||
|
@end
|