| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212 |
- /*
- 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
- - (NSUInteger)maxDepth {
- return jsonParser.maxDepth;
- }
- - (void)setMaxDepth:(NSUInteger)d {
- jsonWriter.maxDepth = jsonParser.maxDepth = 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
|