pax_global_header00006660000000000000000000000064115127015140014507gustar00rootroot0000000000000052 comment=f56d63f961ea8c2c8471ba8f088f36a869c398f7 sbjson-2.3.2/000077500000000000000000000000001151270151400130115ustar00rootroot00000000000000sbjson-2.3.2/.gitignore000066400000000000000000000000321151270151400147740ustar00rootroot00000000000000*.mode1v3 *.pbxuser build sbjson-2.3.2/Changes.markdown000066400000000000000000000167311151270151400161350ustar00rootroot00000000000000# JSON Framework Changes ## Version 2.3.2 (January 10th, 2011) ### Bug fixes * [Issue 13][#13]: Unable to open Targets. Fix bug introduced by trying to be clever and share PBXShellScriptBuildPhases in the project.pbxproj file. [#13]: http://github.com/stig/json-framework/issues/closed/#issue/13 ## Version 2.3.1 (September 25th, 2010) ### Changes * Move to host releases on Github rather than Google code. * Renamed .md files to .markdown. * Removed bench target--use [Sam Soffes's benchmarks][json-benchmark] instead. * Releases are no longer a munged form of the source tree, but identical to the tagged source. [json-benchmark]: http://github.com/samsoffes/json-benchmark ### Bug fixes * [Issue 2][issue#2]: Linkage not supported by default distribution. * [Issue 4][issue#4]: Writer reported to occasionally fail infinity check. * [Issue 8][issue#8]: Installation.markdown refers to missing JSON folder. [issue#2]: http://github.com/stig/json-framework/issues/closed/#issue/2 [issue#4]: http://github.com/stig/json-framework/issues/closed/#issue/4 [issue#8]: http://github.com/stig/json-framework/issues/closed/#issue/8 ## Version 2.3 (August 7, 2010) * Renamed README.md to Readme.md * Updated version number ## Version 2.3beta1 (July 31, 2010) ### Changes * **Parsing performance improvements.** [Issue 56][issue-56]: Dewvinci & Tobias Höhmann came up with a patch to improve parsing of short JSON texts with lots of numbers by over 60%. * **Refactored tests to be more data-driven.** This should make the source leaner and easier to maintain. * **Removed problematic SDK** [Issue 33][issue-33], [58][issue-58], [63][issue-63], and [64][issue-64]: The vast majority of the issues people are having with this framework were related to the somewhat mystical Custom SDK. This has been removed in this version. * **Removed the deprecated SBJSON facade** [Issue 71][issue-71]: You should use the SBJsonParser or SBJsonWriter classes, or the category methods, instead. This also let us remove the SBJsonParser and SBJsonWriter categories; these were only there to support the facade, but made the code less transparent. * **Removed the deprecated fragment support** [Issue 70][issue-70]: Fragments were a bad idea from the start, but deceptively useful while writing the framework's test suite. This has now been rectified. [issue-56]: http://code.google.com/p/json-framework/issues/detail?id=56 [issue-33]: http://code.google.com/p/json-framework/issues/detail?id=33 [issue-58]: http://code.google.com/p/json-framework/issues/detail?id=58 [issue-63]: http://code.google.com/p/json-framework/issues/detail?id=63 [issue-64]: http://code.google.com/p/json-framework/issues/detail?id=64 [issue-70]: http://code.google.com/p/json-framework/issues/detail?id=70 [issue-71]: http://code.google.com/p/json-framework/issues/detail?id=71 ### Bug Fixes * [Issue 38][issue-38]: Fixed header-inclusion issue. * [Issue 74][issue-74]: Fix bug in handling of Infinity, -Infinity & NaN. * [Issue 68][issue-68]: Fixed documentation bug [issue-38]: http://code.google.com/p/json-framework/issues/detail?id=39 [issue-74]: http://code.google.com/p/json-framework/issues/detail?id=74 [issue-68]: http://code.google.com/p/json-framework/issues/detail?id=68 ## Version 2.2.3 (March 7, 2010) * **Added -all_load to libjsontests linker flags.** This allows the tests to run with more recent versions of GCC. * **Unable to do a JSONRepresentation for a first-level proxy object.** [Issue 54][issue-54] & [60][issue-60]: Allow the -proxyForJson method to be called for first-level proxy objects, in addition to objects that are embedded in other objects. [issue-54]: http://code.google.com/p/json-framework/issues/detail?id=54 [issue-60]: http://code.google.com/p/json-framework/issues/detail?id=60 ## Version 2.2.2 (September 12, 2009) * **Fixed error-reporting logic in category methods.** Reported by Mike Monaco. * **iPhone SDK built against iPhoneOS 3.0.** This has been updated from 2.2.1. ## Version 2.2.1 (August 1st, 2009) * **Added svn:ignore property to build directory.** Requested by Rony Kubat. * **Fixed potential corruption in category methods.** If category methods were used in multiple threads they could potentially cause a crash. Reported by dprotaso / Relium. ## Version 2.2 (June 6th, 2009) No changes since 2.2beta1. ## Version 2.2beta1 (May 30th, 2009) * **Renamed method for custom object support** Renamed the -jsonRepresentationProxy method to -proxyForJson. ## Version 2.2alpha5 (May 25th, 2009) * **Added support for custom objects (generation only)** Added an optional -jsonRepresentationProxy method that you can implement (either directly or as category) to enable JSON.framework to create a JSON representation of any object type. See the Tests/ProxyTest.m file for more information on how this works. * **Moved maxDepth to SBJsonBase** Throw errors when the input is nested too deep for writing json as well as parsing. This allows us to exit cleanly rather than break the stack if someone accidentally creates a recursive structure. ## Version 2.2alpha4 (May 21st, 2009) * **Renamed protocols and moved method declarations** Renamed SBJsonWriterOptions and SBJsonParserOptions protocols to be the same as their primary implementations and moved their one public method there. * **Implemented proxy methods in SBJSON** This facade now implements the same methods as the SBJsonWriter and SBJsonParser objects, and simply forwards to them. * **Extracted private methods to private protocol** Don't use these please. * **Improved documentation generation** Classes now inherit documentation from their superclasses and protocols they implement. ## Version 2.2alpha3 (May 16th, 2009) * **Reintroduced the iPhone Custom SDK** For the benefit of users who prefer not to copy the JSON source files into their project. Also updated it to be based on iPhoneOS v2.2.1. * **Deprecated methods for dealing with fragments** Tweaked the new interface classes to support the old fragment-methods one more version. ## Version 2.2alpha2 (May 11th, 2009) * **Added a Changes file.** So people can see what the changes are for each version without having to go to the project home page. * **Updated Credits.** Some people that have provided patches (or other valuable contributions) had been left out. I've done my best to add those in. (If you feel that you or someone else are still missing, please let me know.) * **Removed .svn folders from distribution.** The JSON source folder had a .svn folder in it, which could have caused problems when dragging it into your project. ## Version 2.2alpha1 (May 10th, 2009) * **Improved installation instructions, particularly for the iPhone.** Getting the SDK to work properly in all configurations has proved to be a headache. Therefore the SDK has been removed in favour of instructions for simply copying the source files into your project. * **Split the SBJSON class into a writer and parser class.** SBJSON remains as a facade for backwards compatibility. This refactoring also quashed warnings reported by the Clang static analyser. * **Improved interface for dealing with errors.** Rather than having to pass in a pointer to an NSError object, you can now simply call a method to get the error stack back if there was an error. (The NSError-based API remains in the SBJSON facade, but is not present in the new classes.) * **Documentation updates.** Minor updates to the documentation. Release notes for earlier releases can be found here: http://code.google.com/p/json-framework/wiki/ReleaseNotes sbjson-2.3.2/Classes/000077500000000000000000000000001151270151400144065ustar00rootroot00000000000000sbjson-2.3.2/Classes/JSON.h000066400000000000000000000053051151270151400153330ustar00rootroot00000000000000/* Copyright (C) 2009-2010 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. */ /** @mainpage A strict JSON parser and generator for Objective-C JSON (JavaScript Object Notation) is a lightweight data-interchange format. This framework provides two apis for parsing and generating JSON. One standard object-based and a higher level api consisting of categories added to existing Objective-C classes. This framework does its best to be as strict as possible, both in what it accepts and what it generates. For example, it does not support trailing commas in arrays or objects. Nor does it support embedded comments, or anything else not in the JSON specification. This is considered a feature. @section Links @li Project home page. @li Online version of the API documentation. */ // This setting of 1 is best if you copy the source into your project. // The build transforms the 1 to a 0 when building the framework and static lib. #if 1 #import "SBJsonParser.h" #import "SBJsonWriter.h" #import "NSObject+SBJSON.h" #import "NSString+SBJSON.h" #else #import #import #import #import #endif sbjson-2.3.2/Classes/NSObject+SBJSON.h000066400000000000000000000041371151270151400172250ustar00rootroot00000000000000/* Copyright (C) 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 /** @brief Adds JSON generation to Foundation classes This is a category on NSObject that adds methods for returning JSON representations of standard objects to the objects themselves. This means you can call the -JSONRepresentation method on an NSArray object and it'll do what you want. */ @interface NSObject (NSObject_SBJSON) /** @brief Returns a string containing the receiver encoded in JSON. This method is added as a category on NSObject but is only actually supported for the following objects: @li NSDictionary @li NSArray */ - (NSString *)JSONRepresentation; @end sbjson-2.3.2/Classes/NSObject+SBJSON.m000066400000000000000000000035751151270151400172370ustar00rootroot00000000000000/* Copyright (C) 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 "NSObject+SBJSON.h" #import "SBJsonWriter.h" @implementation NSObject (NSObject_SBJSON) - (NSString *)JSONRepresentation { SBJsonWriter *jsonWriter = [SBJsonWriter new]; NSString *json = [jsonWriter stringWithObject:self]; if (!json) NSLog(@"-JSONRepresentation failed. Error trace is: %@", [jsonWriter errorTrace]); [jsonWriter release]; return json; } @end sbjson-2.3.2/Classes/NSString+SBJSON.h000066400000000000000000000037601151270151400172660ustar00rootroot00000000000000/* Copyright (C) 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 /** @brief Adds JSON parsing methods to NSString This is a category on NSString that adds methods for parsing the target string. */ @interface NSString (NSString_SBJSON) /** @brief Returns the NSDictionary or NSArray represented by the current string's JSON representation. Returns the dictionary or array represented in the receiver, or nil on error. Returns the NSDictionary or NSArray represented by the current string's JSON representation. */ - (id)JSONValue; @end sbjson-2.3.2/Classes/NSString+SBJSON.m000066400000000000000000000035351151270151400172730ustar00rootroot00000000000000/* 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 "NSString+SBJSON.h" #import "SBJsonParser.h" @implementation NSString (NSString_SBJSON) - (id)JSONValue { SBJsonParser *jsonParser = [SBJsonParser new]; id repr = [jsonParser objectWithString:self]; if (!repr) NSLog(@"-JSONValue failed. Error trace is: %@", [jsonParser errorTrace]); [jsonParser release]; return repr; } @end sbjson-2.3.2/Classes/SBJsonBase.h000066400000000000000000000056021151270151400165130ustar00rootroot00000000000000/* Copyright (C) 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 extern NSString * SBJSONErrorDomain; enum { EUNSUPPORTED = 1, EPARSENUM, EPARSE, EFRAGMENT, ECTRL, EUNICODE, EDEPTH, EESCAPE, ETRAILCOMMA, ETRAILGARBAGE, EEOF, EINPUT }; /** @brief Common base class for parsing & writing. This class contains the common error-handling code and option between the parser/writer. */ @interface SBJsonBase : NSObject { NSMutableArray *errorTrace; @protected NSUInteger depth, maxDepth; } /** @brief The maximum recursing depth. Defaults to 512. If the input is nested deeper than this the input will be deemed to be malicious and the parser returns nil, signalling an error. ("Nested too deep".) You can turn off this security feature by setting the maxDepth value to 0. */ @property NSUInteger maxDepth; /** @brief Return an error trace, or nil if there was no errors. Note that this method returns the trace of the last method that failed. You need to check the return value of the call you're making to figure out if the call actually failed, before you know call this method. */ @property(copy,readonly) NSArray* errorTrace; /// @internal for use in subclasses to add errors to the stack trace - (void)addErrorWithCode:(NSUInteger)code description:(NSString*)str; /// @internal for use in subclasess to clear the error before a new parsing attempt - (void)clearErrorTrace; @end sbjson-2.3.2/Classes/SBJsonBase.m000066400000000000000000000053011151270151400165140ustar00rootroot00000000000000/* Copyright (C) 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 "SBJsonBase.h" NSString * SBJSONErrorDomain = @"org.brautaset.JSON.ErrorDomain"; @implementation SBJsonBase @synthesize errorTrace; @synthesize maxDepth; - (id)init { self = [super init]; if (self) self.maxDepth = 512; return self; } - (void)dealloc { [errorTrace release]; [super dealloc]; } - (void)addErrorWithCode:(NSUInteger)code description:(NSString*)str { NSDictionary *userInfo; if (!errorTrace) { errorTrace = [NSMutableArray new]; userInfo = [NSDictionary dictionaryWithObject:str forKey:NSLocalizedDescriptionKey]; } else { userInfo = [NSDictionary dictionaryWithObjectsAndKeys: str, NSLocalizedDescriptionKey, [errorTrace lastObject], NSUnderlyingErrorKey, nil]; } NSError *error = [NSError errorWithDomain:SBJSONErrorDomain code:code userInfo:userInfo]; [self willChangeValueForKey:@"errorTrace"]; [errorTrace addObject:error]; [self didChangeValueForKey:@"errorTrace"]; } - (void)clearErrorTrace { [self willChangeValueForKey:@"errorTrace"]; [errorTrace release]; errorTrace = nil; [self didChangeValueForKey:@"errorTrace"]; } @end sbjson-2.3.2/Classes/SBJsonParser.h000066400000000000000000000062171151270151400171000ustar00rootroot00000000000000/* Copyright (C) 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 #import "SBJsonBase.h" /** @brief The JSON parser class. JSON is mapped to Objective-C types in the following way: @li Null -> NSNull @li String -> NSMutableString @li Array -> NSMutableArray @li Object -> NSMutableDictionary @li Boolean -> NSNumber (initialised with -initWithBool:) @li Number -> (NSNumber | NSDecimalNumber) Since Objective-C doesn't have a dedicated class for boolean values, these turns into NSNumber instances. These are initialised with the -initWithBool: method, and round-trip back to JSON properly. (They won't silently suddenly become 0 or 1; they'll be represented as 'true' and 'false' again.) As an optimisation short JSON integers turn into NSNumber instances, while complex ones turn into NSDecimalNumber instances. We can thus avoid any loss of precision as JSON allows ridiculously large numbers. */ @interface SBJsonParser : SBJsonBase { @private const char *c; } /** @brief Return the object represented by the given string 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 */ - (id)objectWithString:(NSString *)repr; /** @brief Return the object represented by the given string 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 jsonText the json string to parse @param error pointer to an NSError object to populate on error */ - (id)objectWithString:(NSString*)jsonText error:(NSError**)error; @end sbjson-2.3.2/Classes/SBJsonParser.m000066400000000000000000000355721151270151400171130ustar00rootroot00000000000000/* Copyright (C) 2009,2010 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 "SBJsonParser.h" @interface SBJsonParser () - (BOOL)scanValue:(NSObject **)o; - (BOOL)scanRestOfArray:(NSMutableArray **)o; - (BOOL)scanRestOfDictionary:(NSMutableDictionary **)o; - (BOOL)scanRestOfNull:(NSNull **)o; - (BOOL)scanRestOfFalse:(NSNumber **)o; - (BOOL)scanRestOfTrue:(NSNumber **)o; - (BOOL)scanRestOfString:(NSMutableString **)o; // Cannot manage without looking at the first digit - (BOOL)scanNumber:(NSNumber **)o; - (BOOL)scanHexQuad:(unichar *)x; - (BOOL)scanUnicodeChar:(unichar *)x; - (BOOL)scanIsAtEnd; @end #define skipWhitespace(c) while (isspace(*c)) c++ #define skipDigits(c) while (isdigit(*c)) c++ @implementation SBJsonParser static char ctrl[0x22]; + (void)initialize { ctrl[0] = '\"'; ctrl[1] = '\\'; for (int i = 1; i < 0x20; i++) ctrl[i+1] = i; ctrl[0x21] = 0; } - (id)objectWithString:(NSString *)repr { [self clearErrorTrace]; if (!repr) { [self addErrorWithCode:EINPUT description:@"Input was 'nil'"]; return nil; } depth = 0; c = [repr UTF8String]; id o; if (![self scanValue:&o]) { return nil; } // We found some valid JSON. But did it also contain something else? if (![self scanIsAtEnd]) { [self addErrorWithCode:ETRAILGARBAGE description:@"Garbage after JSON"]; return nil; } NSAssert1(o, @"Should have a valid object from %@", repr); // Check that the object we've found is a valid JSON container. if (![o isKindOfClass:[NSDictionary class]] && ![o isKindOfClass:[NSArray class]]) { [self addErrorWithCode:EFRAGMENT description:@"Valid fragment, but not JSON"]; return nil; } return o; } - (id)objectWithString:(NSString*)repr error:(NSError**)error { id tmp = [self objectWithString:repr]; if (tmp) return tmp; if (error) *error = [self.errorTrace lastObject]; return nil; } /* In contrast to the public methods, it is an error to omit the error parameter here. */ - (BOOL)scanValue:(NSObject **)o { skipWhitespace(c); switch (*c++) { case '{': return [self scanRestOfDictionary:(NSMutableDictionary **)o]; break; case '[': return [self scanRestOfArray:(NSMutableArray **)o]; break; case '"': return [self scanRestOfString:(NSMutableString **)o]; break; case 'f': return [self scanRestOfFalse:(NSNumber **)o]; break; case 't': return [self scanRestOfTrue:(NSNumber **)o]; break; case 'n': return [self scanRestOfNull:(NSNull **)o]; break; case '-': case '0'...'9': c--; // cannot verify number correctly without the first character return [self scanNumber:(NSNumber **)o]; break; case '+': [self addErrorWithCode:EPARSENUM description: @"Leading + disallowed in number"]; return NO; break; case 0x0: [self addErrorWithCode:EEOF description:@"Unexpected end of string"]; return NO; break; default: [self addErrorWithCode:EPARSE description: @"Unrecognised leading character"]; return NO; break; } NSAssert(0, @"Should never get here"); return NO; } - (BOOL)scanRestOfTrue:(NSNumber **)o { if (!strncmp(c, "rue", 3)) { c += 3; *o = [NSNumber numberWithBool:YES]; return YES; } [self addErrorWithCode:EPARSE description:@"Expected 'true'"]; return NO; } - (BOOL)scanRestOfFalse:(NSNumber **)o { if (!strncmp(c, "alse", 4)) { c += 4; *o = [NSNumber numberWithBool:NO]; return YES; } [self addErrorWithCode:EPARSE description: @"Expected 'false'"]; return NO; } - (BOOL)scanRestOfNull:(NSNull **)o { if (!strncmp(c, "ull", 3)) { c += 3; *o = [NSNull null]; return YES; } [self addErrorWithCode:EPARSE description: @"Expected 'null'"]; return NO; } - (BOOL)scanRestOfArray:(NSMutableArray **)o { if (maxDepth && ++depth > maxDepth) { [self addErrorWithCode:EDEPTH description: @"Nested too deep"]; return NO; } *o = [NSMutableArray arrayWithCapacity:8]; for (; *c ;) { id v; skipWhitespace(c); if (*c == ']' && c++) { depth--; return YES; } if (![self scanValue:&v]) { [self addErrorWithCode:EPARSE description:@"Expected value while parsing array"]; return NO; } [*o addObject:v]; skipWhitespace(c); if (*c == ',' && c++) { skipWhitespace(c); if (*c == ']') { [self addErrorWithCode:ETRAILCOMMA description: @"Trailing comma disallowed in array"]; return NO; } } } [self addErrorWithCode:EEOF description: @"End of input while parsing array"]; return NO; } - (BOOL)scanRestOfDictionary:(NSMutableDictionary **)o { if (maxDepth && ++depth > maxDepth) { [self addErrorWithCode:EDEPTH description: @"Nested too deep"]; return NO; } *o = [NSMutableDictionary dictionaryWithCapacity:7]; for (; *c ;) { id k, v; skipWhitespace(c); if (*c == '}' && c++) { depth--; return YES; } if (!(*c == '\"' && c++ && [self scanRestOfString:&k])) { [self addErrorWithCode:EPARSE description: @"Object key string expected"]; return NO; } skipWhitespace(c); if (*c != ':') { [self addErrorWithCode:EPARSE description: @"Expected ':' separating key and value"]; return NO; } c++; if (![self scanValue:&v]) { NSString *string = [NSString stringWithFormat:@"Object value expected for key: %@", k]; [self addErrorWithCode:EPARSE description: string]; return NO; } [*o setObject:v forKey:k]; skipWhitespace(c); if (*c == ',' && c++) { skipWhitespace(c); if (*c == '}') { [self addErrorWithCode:ETRAILCOMMA description: @"Trailing comma disallowed in object"]; return NO; } } } [self addErrorWithCode:EEOF description: @"End of input while parsing object"]; return NO; } - (BOOL)scanRestOfString:(NSMutableString **)o { // if the string has no control characters in it, return it in one go, without any temporary allocations. size_t len = strcspn(c, ctrl); if (len && *(c + len) == '\"') { *o = [[[NSMutableString alloc] initWithBytes:(char*)c length:len encoding:NSUTF8StringEncoding] autorelease]; c += len + 1; return YES; } *o = [NSMutableString stringWithCapacity:16]; do { // First see if there's a portion we can grab in one go. // Doing this caused a massive speedup on the long string. len = strcspn(c, ctrl); if (len) { // check for id t = [[NSString alloc] initWithBytesNoCopy:(char*)c length:len encoding:NSUTF8StringEncoding freeWhenDone:NO]; if (t) { [*o appendString:t]; [t release]; c += len; } } if (*c == '"') { c++; return YES; } else if (*c == '\\') { unichar uc = *++c; switch (uc) { case '\\': case '/': case '"': break; case 'b': uc = '\b'; break; case 'n': uc = '\n'; break; case 'r': uc = '\r'; break; case 't': uc = '\t'; break; case 'f': uc = '\f'; break; case 'u': c++; if (![self scanUnicodeChar:&uc]) { [self addErrorWithCode:EUNICODE description: @"Broken unicode character"]; return NO; } c--; // hack. break; default: [self addErrorWithCode:EESCAPE description: [NSString stringWithFormat:@"Illegal escape sequence '0x%x'", uc]]; return NO; break; } CFStringAppendCharacters((CFMutableStringRef)*o, &uc, 1); c++; } else if (*c < 0x20) { [self addErrorWithCode:ECTRL description: [NSString stringWithFormat:@"Unescaped control character '0x%x'", *c]]; return NO; } else { NSLog(@"should not be able to get here"); } } while (*c); [self addErrorWithCode:EEOF description:@"Unexpected EOF while parsing string"]; return NO; } - (BOOL)scanUnicodeChar:(unichar *)x { unichar hi, lo; if (![self scanHexQuad:&hi]) { [self addErrorWithCode:EUNICODE description: @"Missing hex quad"]; return NO; } if (hi >= 0xd800) { // high surrogate char? if (hi < 0xdc00) { // yes - expect a low char if (!(*c == '\\' && ++c && *c == 'u' && ++c && [self scanHexQuad:&lo])) { [self addErrorWithCode:EUNICODE description: @"Missing low character in surrogate pair"]; return NO; } if (lo < 0xdc00 || lo >= 0xdfff) { [self addErrorWithCode:EUNICODE description:@"Invalid low surrogate char"]; return NO; } hi = (hi - 0xd800) * 0x400 + (lo - 0xdc00) + 0x10000; } else if (hi < 0xe000) { [self addErrorWithCode:EUNICODE description:@"Invalid high character in surrogate pair"]; return NO; } } *x = hi; return YES; } - (BOOL)scanHexQuad:(unichar *)x { *x = 0; for (int i = 0; i < 4; i++) { unichar uc = *c; c++; int d = (uc >= '0' && uc <= '9') ? uc - '0' : (uc >= 'a' && uc <= 'f') ? (uc - 'a' + 10) : (uc >= 'A' && uc <= 'F') ? (uc - 'A' + 10) : -1; if (d == -1) { [self addErrorWithCode:EUNICODE description:@"Missing hex digit in quad"]; return NO; } *x *= 16; *x += d; } return YES; } - (BOOL)scanNumber:(NSNumber **)o { BOOL simple = YES; const char *ns = c; // The logic to test for validity of the number formatting is relicensed // from JSON::XS with permission from its author Marc Lehmann. // (Available at the CPAN: http://search.cpan.org/dist/JSON-XS/ .) if ('-' == *c) c++; if ('0' == *c && c++) { if (isdigit(*c)) { [self addErrorWithCode:EPARSENUM description: @"Leading 0 disallowed in number"]; return NO; } } else if (!isdigit(*c) && c != ns) { [self addErrorWithCode:EPARSENUM description: @"No digits after initial minus"]; return NO; } else { skipDigits(c); } // Fractional part if ('.' == *c && c++) { simple = NO; if (!isdigit(*c)) { [self addErrorWithCode:EPARSENUM description: @"No digits after decimal point"]; return NO; } skipDigits(c); } // Exponential part if ('e' == *c || 'E' == *c) { simple = NO; c++; if ('-' == *c || '+' == *c) c++; if (!isdigit(*c)) { [self addErrorWithCode:EPARSENUM description: @"No digits after exponent"]; return NO; } skipDigits(c); } // If we are only reading integers, don't go through the expense of creating an NSDecimal. // This ends up being a very large perf win. if (simple) { BOOL negate = NO; long long val = 0; const char *d = ns; if (*d == '-') { negate = YES; d++; } while (isdigit(*d)) { val *= 10; if (val < 0) goto longlong_overflow; val += *d - '0'; if (val < 0) goto longlong_overflow; d++; } *o = [NSNumber numberWithLongLong:negate ? -val : val]; return YES; } else { // jumped to by simple branch, if an overflow occured longlong_overflow:; id str = [[NSString alloc] initWithBytesNoCopy:(char*)ns length:c - ns encoding:NSUTF8StringEncoding freeWhenDone:NO]; [str autorelease]; if (str && (*o = [NSDecimalNumber decimalNumberWithString:str])) return YES; [self addErrorWithCode:EPARSENUM description: @"Failed creating decimal instance"]; return NO; } } - (BOOL)scanIsAtEnd { skipWhitespace(c); return !*c; } @end sbjson-2.3.2/Classes/SBJsonWriter.h000066400000000000000000000107311151270151400171140ustar00rootroot00000000000000/* Copyright (C) 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 #import "SBJsonBase.h" /** @brief The JSON writer class. Objective-C types are mapped to JSON types in the following way: @li NSNull -> Null @li NSString -> String @li NSArray -> Array @li NSDictionary -> Object @li NSNumber (-initWithBool:) -> Boolean @li NSNumber -> Number In JSON the keys of an object must be strings. NSDictionary keys need not be, but attempting to convert an NSDictionary with non-string keys into JSON will throw an exception. NSNumber instances created with the +initWithBool: method are converted into the JSON boolean "true" and "false" values, and vice versa. Any other NSNumber instances are converted to a JSON number the way you would expect. */ @interface SBJsonWriter : SBJsonBase { @private BOOL sortKeys, humanReadable; } /** @brief Whether we are generating human-readable (multiline) JSON. Set whether or not to generate human-readable JSON. The default is NO, which produces JSON without any whitespace. (Except inside strings.) If set to YES, generates human-readable JSON with linebreaks after each array value and dictionary key/value pair, indented two spaces per nesting level. */ @property BOOL humanReadable; /** @brief Whether or not to sort the dictionary keys in the output. If this is set to YES, the dictionary keys in the JSON output will be in sorted order. (This is useful if you need to compare two structures, for example.) The default is NO. */ @property BOOL sortKeys; /** @brief Return JSON representation (or fragment) for the given object. 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 */ - (NSString*)stringWithObject:(id)value; /** @brief Return JSON representation (or fragment) for the given object. 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 pointer to object to be populated with NSError on failure */- (NSString*)stringWithObject:(id)value error:(NSError**)error; @end /** @brief Allows generation of JSON for otherwise unsupported classes. If you have a custom class that you want to create a JSON representation for you can implement this method in your class. It should return a representation of your object defined in terms of objects that can be translated into JSON. For example, a Person object might implement it like this: @code - (id)proxyForJson { return [NSDictionary dictionaryWithObjectsAndKeys: name, @"name", phone, @"phone", email, @"email", nil]; } @endcode */ @interface NSObject (SBProxyForJson) - (id)proxyForJson; @end sbjson-2.3.2/Classes/SBJsonWriter.m000066400000000000000000000201551151270151400171220ustar00rootroot00000000000000/* Copyright (C) 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 "SBJsonWriter.h" @interface SBJsonWriter () - (BOOL)appendValue:(id)fragment into:(NSMutableString*)json; - (BOOL)appendArray:(NSArray*)fragment into:(NSMutableString*)json; - (BOOL)appendDictionary:(NSDictionary*)fragment into:(NSMutableString*)json; - (BOOL)appendString:(NSString*)fragment into:(NSMutableString*)json; - (NSString*)indent; @end @implementation SBJsonWriter @synthesize sortKeys; @synthesize humanReadable; static NSMutableCharacterSet *kEscapeChars; + (void)initialize { kEscapeChars = [[NSMutableCharacterSet characterSetWithRange: NSMakeRange(0,32)] retain]; [kEscapeChars addCharactersInString: @"\"\\"]; } - (NSString*)stringWithObject:(id)value { [self clearErrorTrace]; if ([value isKindOfClass:[NSDictionary class]] || [value isKindOfClass:[NSArray class]]) { depth = 0; NSMutableString *json = [NSMutableString stringWithCapacity:128]; if ([self appendValue:value into:json]) return json; } if ([value respondsToSelector:@selector(proxyForJson)]) { NSString *tmp = [self stringWithObject:[value proxyForJson]]; if (tmp) return tmp; } [self addErrorWithCode:EFRAGMENT description:@"Not valid type for JSON"]; return nil; } - (NSString*)stringWithObject:(id)value error:(NSError**)error { NSString *tmp = [self stringWithObject:value]; if (tmp) return tmp; if (error) *error = [self.errorTrace lastObject]; return nil; } - (NSString*)indent { return [@"\n" stringByPaddingToLength:1 + 2 * depth withString:@" " startingAtIndex:0]; } - (BOOL)appendValue:(id)fragment into:(NSMutableString*)json { if ([fragment isKindOfClass:[NSDictionary class]]) { if (![self appendDictionary:fragment into:json]) return NO; } else if ([fragment isKindOfClass:[NSArray class]]) { if (![self appendArray:fragment into:json]) return NO; } else if ([fragment isKindOfClass:[NSString class]]) { if (![self appendString:fragment into:json]) return NO; } else if ([fragment isKindOfClass:[NSNumber class]]) { if ('c' == *[fragment objCType]) { [json appendString:[fragment boolValue] ? @"true" : @"false"]; } else if ([fragment isEqualToNumber:(NSNumber*)kCFNumberNaN]) { [self addErrorWithCode:EUNSUPPORTED description:@"NaN is not a valid number in JSON"]; return NO; } else if (isinf([fragment doubleValue])) { [self addErrorWithCode:EUNSUPPORTED description:@"Infinity is not a valid number in JSON"]; return NO; } else { [json appendString:[fragment stringValue]]; } } else if ([fragment isKindOfClass:[NSNull class]]) { [json appendString:@"null"]; } else if ([fragment respondsToSelector:@selector(proxyForJson)]) { [self appendValue:[fragment proxyForJson] into:json]; } else { [self addErrorWithCode:EUNSUPPORTED description:[NSString stringWithFormat:@"JSON serialisation not supported for %@", [fragment class]]]; return NO; } return YES; } - (BOOL)appendArray:(NSArray*)fragment into:(NSMutableString*)json { if (maxDepth && ++depth > maxDepth) { [self addErrorWithCode:EDEPTH description: @"Nested too deep"]; return NO; } [json appendString:@"["]; BOOL addComma = NO; for (id value in fragment) { if (addComma) [json appendString:@","]; else addComma = YES; if ([self humanReadable]) [json appendString:[self indent]]; if (![self appendValue:value into:json]) { return NO; } } depth--; if ([self humanReadable] && [fragment count]) [json appendString:[self indent]]; [json appendString:@"]"]; return YES; } - (BOOL)appendDictionary:(NSDictionary*)fragment into:(NSMutableString*)json { if (maxDepth && ++depth > maxDepth) { [self addErrorWithCode:EDEPTH description: @"Nested too deep"]; return NO; } [json appendString:@"{"]; NSString *colon = [self humanReadable] ? @" : " : @":"; BOOL addComma = NO; NSArray *keys = [fragment allKeys]; if (self.sortKeys) keys = [keys sortedArrayUsingSelector:@selector(compare:)]; for (id value in keys) { if (addComma) [json appendString:@","]; else addComma = YES; if ([self humanReadable]) [json appendString:[self indent]]; if (![value isKindOfClass:[NSString class]]) { [self addErrorWithCode:EUNSUPPORTED description: @"JSON object key must be string"]; return NO; } if (![self appendString:value into:json]) return NO; [json appendString:colon]; if (![self appendValue:[fragment objectForKey:value] into:json]) { [self addErrorWithCode:EUNSUPPORTED description:[NSString stringWithFormat:@"Unsupported value for key %@ in object", value]]; return NO; } } depth--; if ([self humanReadable] && [fragment count]) [json appendString:[self indent]]; [json appendString:@"}"]; return YES; } - (BOOL)appendString:(NSString*)fragment into:(NSMutableString*)json { [json appendString:@"\""]; NSRange esc = [fragment rangeOfCharacterFromSet:kEscapeChars]; if ( !esc.length ) { // No special chars -- can just add the raw string: [json appendString:fragment]; } else { NSUInteger length = [fragment length]; for (NSUInteger i = 0; i < length; i++) { unichar uc = [fragment characterAtIndex:i]; switch (uc) { case '"': [json appendString:@"\\\""]; break; case '\\': [json appendString:@"\\\\"]; break; case '\t': [json appendString:@"\\t"]; break; case '\n': [json appendString:@"\\n"]; break; case '\r': [json appendString:@"\\r"]; break; case '\b': [json appendString:@"\\b"]; break; case '\f': [json appendString:@"\\f"]; break; default: if (uc < 0x20) { [json appendFormat:@"\\u%04x", uc]; } else { CFStringAppendCharacters((CFMutableStringRef)json, &uc, 1); } break; } } } [json appendString:@"\""]; return YES; } @end sbjson-2.3.2/Credits.markdown000066400000000000000000000032201151270151400161470ustar00rootroot00000000000000# Credits Without these people JSON Framework wouldn't be what it is today. Please let me know if I've mistakenly omitted anyone. ## Blake Seely Inspiration for early versions of this framwork came from Blake's BSJSONAdditions. ## Marc Lehmann Marc is the author of the excellent JSON::XS Perl module. The number validation routine in my framework is re-licensed from his module, with his permission. ## Jens Alfke, jens@mooseyard.com, http://mooseyard.com/Jens/ Patches that gave a speedup of 11 times for generation and 5 times for parsing of the long (about 12k) JSON string I was using for testing. ## Greg Bolsinga * Patch for dropping the dependency on AppKit, making this a Foundation framework. * Patch for building a static library, and instructions for creating a custom SDK suitable for the iPhone. ## Ben Rimmington Patch speeding writing up by about 100% and parsing by 10% for certain inputs. ##renerattur Patch to remove memory leak. ## dmaclach * Patch to be warning-free with -Wparanthesis. * Prompted me to fix some Clang static analysis errors. ## boredzo Patch to stop memory leak in -JSONValue and friends. ## Adium, http://adiumx.com Provided patch to fix crash when parsing facebook chat responses. ## Joerg Schwieder Patch to install instructions for use of static library. ## Mike Monaco Pointed out embarrasing mistake in logic to report errors in the category methods of 2.2.1. ## dewvinci & Tobias Höhmann Performance patch for integer numbers and strings without special characters. ## George MacKerron Reported bug in SBJsonWriter's handling of NaN, Infinity and -Infinity. ## jinksys Reported bug with header inclusion of framework. sbjson-2.3.2/Installation.markdown000066400000000000000000000026131151270151400172200ustar00rootroot00000000000000Super-simple installation ========================= By *far* the simplest way to start using JSON in your iPhone, iPad, or Mac application is to simply copy all the source files (the contents of the `Classes` folder) into your own Xcode project. 1. In the Finder, open the `json-framework/Classes` folder and select all the files. 1. Drop-and-drop them on the **Classes** group in the **Groups & Files** menu of your Xcode project. 1. Tick the **Copy items into destination group's folder** option. 1. Use `#import "JSON.h"` in your source files. That should be it. Now create that Twitter client! Upgrading --------- If you're upgrading from a previous version, make sure you're deleting the old JSON classes first, moving all the files to Trash. Trouble-shooting ---------------- Check to see if the answers to the [Frequently Asked Questions][faq] are of any help. [faq]: http://github.com/stig/json-framework/wiki/FrequentlyAskedQuestions Alternative installation instructions ===================================== Copying the JSON Classes into your project isn't the *only* way to use this framework. I've created a couple of examples that link to this framework rather than copy the sources. Check them out at github: * [Linking to JSON Framework on the iPhone, iPad & iPod Touch](http://github.com/stig/JsonSampleIPhone) * [Linking to JSON Framework on the Mac](http://github.com/stig/JsonSampleMac) sbjson-2.3.2/JSON-Info.plist000066400000000000000000000012431151270151400155300ustar00rootroot00000000000000 CFBundleDevelopmentRegion English CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier org.brautaset.JSON CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType FMWK CFBundleShortVersionString 2.3.1 CFBundleSignature ???? CFBundleVersion 1.1.1 sbjson-2.3.2/JSON.xcodeproj/000077500000000000000000000000001151270151400155565ustar00rootroot00000000000000sbjson-2.3.2/JSON.xcodeproj/project.pbxproj000066400000000000000000002750271151270151400206470ustar00rootroot00000000000000// !$*UTF8*$! { archiveVersion = 1; classes = { }; objectVersion = 46; objects = { /* Begin PBXAggregateTarget section */ BCC047160FB651AF00F9F2D3 /* Documentation */ = { isa = PBXAggregateTarget; buildConfigurationList = BCC047190FB651CD00F9F2D3 /* Build configuration list for PBXAggregateTarget "Documentation" */; buildPhases = ( BCC047150FB651AF00F9F2D3 /* Install Docset */, BC3A1CB112023B860051A978 /* Refresh Online Docs */, ); dependencies = ( ); name = Documentation; productName = Documentation; }; /* End PBXAggregateTarget section */ /* Begin PBXBuildFile section */ 5351577A0F6E3BE100C8AABD /* SBJsonParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 535157780F6E3BE100C8AABD /* SBJsonParser.h */; settings = {ATTRIBUTES = (Private, ); }; }; 5351577B0F6E3BE100C8AABD /* SBJsonParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 535157790F6E3BE100C8AABD /* SBJsonParser.m */; }; 5351577C0F6E3BE100C8AABD /* SBJsonParser.h in Headers */ = {isa = PBXBuildFile; fileRef = 535157780F6E3BE100C8AABD /* SBJsonParser.h */; settings = {ATTRIBUTES = (Private, ); }; }; 5351577D0F6E3BE100C8AABD /* SBJsonParser.m in Sources */ = {isa = PBXBuildFile; fileRef = 535157790F6E3BE100C8AABD /* SBJsonParser.m */; }; 535157A50F6EE4A800C8AABD /* SBJsonWriter.h in Headers */ = {isa = PBXBuildFile; fileRef = 535157A30F6EE4A800C8AABD /* SBJsonWriter.h */; settings = {ATTRIBUTES = (Private, ); }; }; 535157A60F6EE4A800C8AABD /* SBJsonWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = 535157A40F6EE4A800C8AABD /* SBJsonWriter.m */; }; 535157A70F6EE4A800C8AABD /* SBJsonWriter.h in Headers */ = {isa = PBXBuildFile; fileRef = 535157A30F6EE4A800C8AABD /* SBJsonWriter.h */; settings = {ATTRIBUTES = (Private, ); }; }; 535157A80F6EE4A800C8AABD /* SBJsonWriter.m in Sources */ = {isa = PBXBuildFile; fileRef = 535157A40F6EE4A800C8AABD /* SBJsonWriter.m */; }; 535158700F70DE7A00C8AABD /* SBJsonBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 5351586F0F70DE7A00C8AABD /* SBJsonBase.h */; settings = {ATTRIBUTES = (Private, ); }; }; 535158710F70DE7A00C8AABD /* SBJsonBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 5351586F0F70DE7A00C8AABD /* SBJsonBase.h */; settings = {ATTRIBUTES = (Private, ); }; }; 535158730F70DE7B00C8AABD /* SBJsonBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 535158720F70DE7B00C8AABD /* SBJsonBase.m */; }; 535158740F70DE7B00C8AABD /* SBJsonBase.m in Sources */ = {isa = PBXBuildFile; fileRef = 535158720F70DE7B00C8AABD /* SBJsonBase.m */; }; 53C45B9C0C98A87600546F66 /* ErrorTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 53C45B9B0C98A87600546F66 /* ErrorTest.m */; }; 53D2299C0C96129800276605 /* JSON.h in Headers */ = {isa = PBXBuildFile; fileRef = 53D2299A0C96129800276605 /* JSON.h */; settings = {ATTRIBUTES = (Public, ); }; }; 53D229AD0C961B9900276605 /* JSON.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 53D229810C96121600276605 /* JSON.framework */; }; 53F8A8150E57158200355C72 /* libjson.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FE2BBD800D8B0D3900184787 /* libjson.a */; }; BC0387E811CEC07A0080C552 /* AbstractTest.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0387E711CEC07A0080C552 /* AbstractTest.m */; }; BC0387E911CEC07A0080C552 /* AbstractTest.m in Sources */ = {isa = PBXBuildFile; fileRef = BC0387E711CEC07A0080C552 /* AbstractTest.m */; }; BC74B6EC0FC9FAD0000BD3DD /* MaxDepthTest.m in Sources */ = {isa = PBXBuildFile; fileRef = BC74B6EB0FC9FAD0000BD3DD /* MaxDepthTest.m */; }; BC74B6ED0FC9FAD0000BD3DD /* MaxDepthTest.m in Sources */ = {isa = PBXBuildFile; fileRef = BC74B6EB0FC9FAD0000BD3DD /* MaxDepthTest.m */; }; BC74B7AE0FCA8B89000BD3DD /* ProxyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = BC74B7AD0FCA8B89000BD3DD /* ProxyTest.m */; }; BC74B7AF0FCA8B89000BD3DD /* ProxyTest.m in Sources */ = {isa = PBXBuildFile; fileRef = BC74B7AD0FCA8B89000BD3DD /* ProxyTest.m */; }; BC8F72A71235331400678720 /* WriterTest.m in Sources */ = {isa = PBXBuildFile; fileRef = BC8F72A61235331400678720 /* WriterTest.m */; }; BC8F72A81235331400678720 /* WriterTest.m in Sources */ = {isa = PBXBuildFile; fileRef = BC8F72A61235331400678720 /* WriterTest.m */; }; BCB55A5E1221D09400ACE34F /* array.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A001221D09400ACE34F /* array.json */; }; BCB55A5F1221D09400ACE34F /* array.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A011221D09400ACE34F /* array.json.pretty */; }; BCB55A601221D09400ACE34F /* array.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A021221D09400ACE34F /* array.json.terse */; }; BCB55A611221D09400ACE34F /* bool.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A031221D09400ACE34F /* bool.json */; }; BCB55A621221D09400ACE34F /* bool.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A041221D09400ACE34F /* bool.json.pretty */; }; BCB55A631221D09400ACE34F /* bool.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A051221D09400ACE34F /* bool.json.terse */; }; BCB55A641221D09400ACE34F /* format.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A061221D09400ACE34F /* format.json */; }; BCB55A651221D09400ACE34F /* format.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A071221D09400ACE34F /* format.json.pretty */; }; BCB55A661221D09400ACE34F /* format.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A081221D09400ACE34F /* format.json.terse */; }; BCB55A671221D09400ACE34F /* 1.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A0A1221D09400ACE34F /* 1.json */; }; BCB55A681221D09400ACE34F /* 1.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A0B1221D09400ACE34F /* 1.json.pretty */; }; BCB55A691221D09400ACE34F /* 1.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A0C1221D09400ACE34F /* 1.json.terse */; }; BCB55A6A1221D09400ACE34F /* 2.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A0D1221D09400ACE34F /* 2.json */; }; BCB55A6B1221D09400ACE34F /* 2.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A0E1221D09400ACE34F /* 2.json.pretty */; }; BCB55A6C1221D09400ACE34F /* 2.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A0F1221D09400ACE34F /* 2.json.terse */; }; BCB55A6D1221D09400ACE34F /* 3.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A101221D09400ACE34F /* 3.json */; }; BCB55A6E1221D09400ACE34F /* 3.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A111221D09400ACE34F /* 3.json.pretty */; }; BCB55A6F1221D09400ACE34F /* 3.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A121221D09400ACE34F /* 3.json.terse */; }; BCB55A701221D09400ACE34F /* 4.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A131221D09400ACE34F /* 4.json */; }; BCB55A711221D09400ACE34F /* 4.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A141221D09400ACE34F /* 4.json.pretty */; }; BCB55A721221D09400ACE34F /* 4.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A151221D09400ACE34F /* 4.json.terse */; }; BCB55A731221D09400ACE34F /* 5.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A161221D09400ACE34F /* 5.json */; }; BCB55A741221D09400ACE34F /* 5.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A171221D09400ACE34F /* 5.json.pretty */; }; BCB55A751221D09400ACE34F /* 5.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A181221D09400ACE34F /* 5.json.terse */; }; BCB55A761221D09400ACE34F /* fail1.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A1A1221D09400ACE34F /* fail1.json */; }; BCB55A771221D09400ACE34F /* fail10.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A1B1221D09400ACE34F /* fail10.json */; }; BCB55A781221D09400ACE34F /* fail11.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A1C1221D09400ACE34F /* fail11.json */; }; BCB55A791221D09400ACE34F /* fail12.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A1D1221D09400ACE34F /* fail12.json */; }; BCB55A7A1221D09400ACE34F /* fail13.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A1E1221D09400ACE34F /* fail13.json */; }; BCB55A7B1221D09400ACE34F /* fail14.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A1F1221D09400ACE34F /* fail14.json */; }; BCB55A7C1221D09400ACE34F /* fail15.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A201221D09400ACE34F /* fail15.json */; }; BCB55A7D1221D09400ACE34F /* fail16.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A211221D09400ACE34F /* fail16.json */; }; BCB55A7E1221D09400ACE34F /* fail17.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A221221D09400ACE34F /* fail17.json */; }; BCB55A7F1221D09400ACE34F /* fail18.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A231221D09400ACE34F /* fail18.json */; }; BCB55A801221D09400ACE34F /* fail19.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A241221D09400ACE34F /* fail19.json */; }; BCB55A811221D09400ACE34F /* fail2.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A251221D09400ACE34F /* fail2.json */; }; BCB55A821221D09400ACE34F /* fail20.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A261221D09400ACE34F /* fail20.json */; }; BCB55A831221D09400ACE34F /* fail21.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A271221D09400ACE34F /* fail21.json */; }; BCB55A841221D09400ACE34F /* fail22.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A281221D09400ACE34F /* fail22.json */; }; BCB55A851221D09400ACE34F /* fail23.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A291221D09400ACE34F /* fail23.json */; }; BCB55A861221D09400ACE34F /* fail24.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A2A1221D09400ACE34F /* fail24.json */; }; BCB55A871221D09400ACE34F /* fail25.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A2B1221D09400ACE34F /* fail25.json */; }; BCB55A881221D09400ACE34F /* fail26.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A2C1221D09400ACE34F /* fail26.json */; }; BCB55A891221D09400ACE34F /* fail27.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A2D1221D09400ACE34F /* fail27.json */; }; BCB55A8A1221D09400ACE34F /* fail28.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A2E1221D09400ACE34F /* fail28.json */; }; BCB55A8B1221D09400ACE34F /* fail29.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A2F1221D09400ACE34F /* fail29.json */; }; BCB55A8C1221D09400ACE34F /* fail3.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A301221D09400ACE34F /* fail3.json */; }; BCB55A8D1221D09400ACE34F /* fail30.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A311221D09400ACE34F /* fail30.json */; }; BCB55A8E1221D09400ACE34F /* fail31.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A321221D09400ACE34F /* fail31.json */; }; BCB55A8F1221D09400ACE34F /* fail32.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A331221D09400ACE34F /* fail32.json */; }; BCB55A901221D09400ACE34F /* fail33.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A341221D09400ACE34F /* fail33.json */; }; BCB55A911221D09400ACE34F /* fail4.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A351221D09400ACE34F /* fail4.json */; }; BCB55A921221D09400ACE34F /* fail5.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A361221D09400ACE34F /* fail5.json */; }; BCB55A931221D09400ACE34F /* fail6.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A371221D09400ACE34F /* fail6.json */; }; BCB55A941221D09400ACE34F /* fail7.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A381221D09400ACE34F /* fail7.json */; }; BCB55A951221D09400ACE34F /* fail8.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A391221D09400ACE34F /* fail8.json */; }; BCB55A961221D09400ACE34F /* fail9.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A3A1221D09400ACE34F /* fail9.json */; }; BCB55A971221D09400ACE34F /* pass1.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A3B1221D09400ACE34F /* pass1.json */; }; BCB55A981221D09400ACE34F /* pass1.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A3C1221D09400ACE34F /* pass1.json.pretty */; }; BCB55A991221D09400ACE34F /* pass1.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A3D1221D09400ACE34F /* pass1.json.terse */; }; BCB55A9A1221D09400ACE34F /* pass2.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A3E1221D09400ACE34F /* pass2.json */; }; BCB55A9B1221D09400ACE34F /* pass2.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A3F1221D09400ACE34F /* pass2.json.pretty */; }; BCB55A9C1221D09400ACE34F /* pass2.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A401221D09400ACE34F /* pass2.json.terse */; }; BCB55A9D1221D09400ACE34F /* pass3.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A411221D09400ACE34F /* pass3.json */; }; BCB55A9E1221D09400ACE34F /* pass3.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A421221D09400ACE34F /* pass3.json.pretty */; }; BCB55A9F1221D09400ACE34F /* pass3.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A431221D09400ACE34F /* pass3.json.terse */; }; BCB55AA01221D09400ACE34F /* null.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A441221D09400ACE34F /* null.json */; }; BCB55AA11221D09400ACE34F /* null.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A451221D09400ACE34F /* null.json.pretty */; }; BCB55AA21221D09400ACE34F /* null.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A461221D09400ACE34F /* null.json.terse */; }; BCB55AA31221D09400ACE34F /* number.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A471221D09400ACE34F /* number.json */; }; BCB55AA41221D09400ACE34F /* number.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A481221D09400ACE34F /* number.json.pretty */; }; BCB55AA51221D09400ACE34F /* number.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A491221D09400ACE34F /* number.json.terse */; }; BCB55AA61221D09400ACE34F /* object.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A4A1221D09400ACE34F /* object.json */; }; BCB55AA71221D09400ACE34F /* object.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A4B1221D09400ACE34F /* object.json.pretty */; }; BCB55AA81221D09400ACE34F /* object.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A4C1221D09400ACE34F /* object.json.terse */; }; BCB55AAA1221D09400ACE34F /* a.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A4F1221D09400ACE34F /* a.json */; }; BCB55AAB1221D09400ACE34F /* a.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A501221D09400ACE34F /* a.json.pretty */; }; BCB55AAC1221D09400ACE34F /* a.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A511221D09400ACE34F /* a.json.terse */; }; BCB55AAD1221D09400ACE34F /* b.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A521221D09400ACE34F /* b.json */; }; BCB55AAE1221D09400ACE34F /* b.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A531221D09400ACE34F /* b.json.pretty */; }; BCB55AAF1221D09400ACE34F /* b.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A541221D09400ACE34F /* b.json.terse */; }; BCB55AB01221D09400ACE34F /* string-ctrl.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A551221D09400ACE34F /* string-ctrl.json */; }; BCB55AB11221D09400ACE34F /* string-ctrl.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A561221D09400ACE34F /* string-ctrl.json.pretty */; }; BCB55AB21221D09400ACE34F /* string-ctrl.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A571221D09400ACE34F /* string-ctrl.json.terse */; }; BCB55AB31221D09400ACE34F /* string-unicode.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A581221D09400ACE34F /* string-unicode.json */; }; BCB55AB41221D09400ACE34F /* string-unicode.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A591221D09400ACE34F /* string-unicode.json.pretty */; }; BCB55AB51221D09400ACE34F /* string-unicode.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A5A1221D09400ACE34F /* string-unicode.json.terse */; }; BCB55AB61221D09400ACE34F /* string.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A5B1221D09400ACE34F /* string.json */; }; BCB55AB71221D09400ACE34F /* string.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A5C1221D09400ACE34F /* string.json.pretty */; }; BCB55AB81221D09400ACE34F /* string.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A5D1221D09400ACE34F /* string.json.terse */; }; BCB55AB91221D09400ACE34F /* array.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A001221D09400ACE34F /* array.json */; }; BCB55ABA1221D09400ACE34F /* array.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A011221D09400ACE34F /* array.json.pretty */; }; BCB55ABB1221D09400ACE34F /* array.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A021221D09400ACE34F /* array.json.terse */; }; BCB55ABC1221D09400ACE34F /* bool.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A031221D09400ACE34F /* bool.json */; }; BCB55ABD1221D09400ACE34F /* bool.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A041221D09400ACE34F /* bool.json.pretty */; }; BCB55ABE1221D09400ACE34F /* bool.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A051221D09400ACE34F /* bool.json.terse */; }; BCB55ABF1221D09400ACE34F /* format.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A061221D09400ACE34F /* format.json */; }; BCB55AC01221D09400ACE34F /* format.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A071221D09400ACE34F /* format.json.pretty */; }; BCB55AC11221D09400ACE34F /* format.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A081221D09400ACE34F /* format.json.terse */; }; BCB55AC21221D09400ACE34F /* 1.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A0A1221D09400ACE34F /* 1.json */; }; BCB55AC31221D09400ACE34F /* 1.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A0B1221D09400ACE34F /* 1.json.pretty */; }; BCB55AC41221D09400ACE34F /* 1.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A0C1221D09400ACE34F /* 1.json.terse */; }; BCB55AC51221D09400ACE34F /* 2.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A0D1221D09400ACE34F /* 2.json */; }; BCB55AC61221D09400ACE34F /* 2.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A0E1221D09400ACE34F /* 2.json.pretty */; }; BCB55AC71221D09400ACE34F /* 2.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A0F1221D09400ACE34F /* 2.json.terse */; }; BCB55AC81221D09400ACE34F /* 3.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A101221D09400ACE34F /* 3.json */; }; BCB55AC91221D09400ACE34F /* 3.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A111221D09400ACE34F /* 3.json.pretty */; }; BCB55ACA1221D09400ACE34F /* 3.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A121221D09400ACE34F /* 3.json.terse */; }; BCB55ACB1221D09400ACE34F /* 4.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A131221D09400ACE34F /* 4.json */; }; BCB55ACC1221D09400ACE34F /* 4.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A141221D09400ACE34F /* 4.json.pretty */; }; BCB55ACD1221D09400ACE34F /* 4.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A151221D09400ACE34F /* 4.json.terse */; }; BCB55ACE1221D09400ACE34F /* 5.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A161221D09400ACE34F /* 5.json */; }; BCB55ACF1221D09400ACE34F /* 5.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A171221D09400ACE34F /* 5.json.pretty */; }; BCB55AD01221D09400ACE34F /* 5.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A181221D09400ACE34F /* 5.json.terse */; }; BCB55AD11221D09400ACE34F /* fail1.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A1A1221D09400ACE34F /* fail1.json */; }; BCB55AD21221D09400ACE34F /* fail10.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A1B1221D09400ACE34F /* fail10.json */; }; BCB55AD31221D09400ACE34F /* fail11.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A1C1221D09400ACE34F /* fail11.json */; }; BCB55AD41221D09400ACE34F /* fail12.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A1D1221D09400ACE34F /* fail12.json */; }; BCB55AD51221D09400ACE34F /* fail13.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A1E1221D09400ACE34F /* fail13.json */; }; BCB55AD61221D09400ACE34F /* fail14.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A1F1221D09400ACE34F /* fail14.json */; }; BCB55AD71221D09400ACE34F /* fail15.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A201221D09400ACE34F /* fail15.json */; }; BCB55AD81221D09400ACE34F /* fail16.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A211221D09400ACE34F /* fail16.json */; }; BCB55AD91221D09400ACE34F /* fail17.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A221221D09400ACE34F /* fail17.json */; }; BCB55ADA1221D09400ACE34F /* fail18.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A231221D09400ACE34F /* fail18.json */; }; BCB55ADB1221D09400ACE34F /* fail19.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A241221D09400ACE34F /* fail19.json */; }; BCB55ADC1221D09400ACE34F /* fail2.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A251221D09400ACE34F /* fail2.json */; }; BCB55ADD1221D09400ACE34F /* fail20.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A261221D09400ACE34F /* fail20.json */; }; BCB55ADE1221D09400ACE34F /* fail21.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A271221D09400ACE34F /* fail21.json */; }; BCB55ADF1221D09400ACE34F /* fail22.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A281221D09400ACE34F /* fail22.json */; }; BCB55AE01221D09400ACE34F /* fail23.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A291221D09400ACE34F /* fail23.json */; }; BCB55AE11221D09400ACE34F /* fail24.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A2A1221D09400ACE34F /* fail24.json */; }; BCB55AE21221D09400ACE34F /* fail25.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A2B1221D09400ACE34F /* fail25.json */; }; BCB55AE31221D09400ACE34F /* fail26.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A2C1221D09400ACE34F /* fail26.json */; }; BCB55AE41221D09400ACE34F /* fail27.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A2D1221D09400ACE34F /* fail27.json */; }; BCB55AE51221D09400ACE34F /* fail28.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A2E1221D09400ACE34F /* fail28.json */; }; BCB55AE61221D09400ACE34F /* fail29.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A2F1221D09400ACE34F /* fail29.json */; }; BCB55AE71221D09400ACE34F /* fail3.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A301221D09400ACE34F /* fail3.json */; }; BCB55AE81221D09400ACE34F /* fail30.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A311221D09400ACE34F /* fail30.json */; }; BCB55AE91221D09400ACE34F /* fail31.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A321221D09400ACE34F /* fail31.json */; }; BCB55AEA1221D09400ACE34F /* fail32.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A331221D09400ACE34F /* fail32.json */; }; BCB55AEB1221D09400ACE34F /* fail33.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A341221D09400ACE34F /* fail33.json */; }; BCB55AEC1221D09400ACE34F /* fail4.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A351221D09400ACE34F /* fail4.json */; }; BCB55AED1221D09400ACE34F /* fail5.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A361221D09400ACE34F /* fail5.json */; }; BCB55AEE1221D09400ACE34F /* fail6.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A371221D09400ACE34F /* fail6.json */; }; BCB55AEF1221D09400ACE34F /* fail7.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A381221D09400ACE34F /* fail7.json */; }; BCB55AF01221D09400ACE34F /* fail8.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A391221D09400ACE34F /* fail8.json */; }; BCB55AF11221D09400ACE34F /* fail9.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A3A1221D09400ACE34F /* fail9.json */; }; BCB55AF21221D09400ACE34F /* pass1.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A3B1221D09400ACE34F /* pass1.json */; }; BCB55AF31221D09400ACE34F /* pass1.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A3C1221D09400ACE34F /* pass1.json.pretty */; }; BCB55AF41221D09400ACE34F /* pass1.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A3D1221D09400ACE34F /* pass1.json.terse */; }; BCB55AF51221D09400ACE34F /* pass2.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A3E1221D09400ACE34F /* pass2.json */; }; BCB55AF61221D09400ACE34F /* pass2.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A3F1221D09400ACE34F /* pass2.json.pretty */; }; BCB55AF71221D09400ACE34F /* pass2.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A401221D09400ACE34F /* pass2.json.terse */; }; BCB55AF81221D09400ACE34F /* pass3.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A411221D09400ACE34F /* pass3.json */; }; BCB55AF91221D09400ACE34F /* pass3.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A421221D09400ACE34F /* pass3.json.pretty */; }; BCB55AFA1221D09400ACE34F /* pass3.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A431221D09400ACE34F /* pass3.json.terse */; }; BCB55AFB1221D09400ACE34F /* null.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A441221D09400ACE34F /* null.json */; }; BCB55AFC1221D09400ACE34F /* null.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A451221D09400ACE34F /* null.json.pretty */; }; BCB55AFD1221D09400ACE34F /* null.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A461221D09400ACE34F /* null.json.terse */; }; BCB55AFE1221D09400ACE34F /* number.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A471221D09400ACE34F /* number.json */; }; BCB55AFF1221D09400ACE34F /* number.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A481221D09400ACE34F /* number.json.pretty */; }; BCB55B001221D09400ACE34F /* number.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A491221D09400ACE34F /* number.json.terse */; }; BCB55B011221D09400ACE34F /* object.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A4A1221D09400ACE34F /* object.json */; }; BCB55B021221D09400ACE34F /* object.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A4B1221D09400ACE34F /* object.json.pretty */; }; BCB55B031221D09400ACE34F /* object.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A4C1221D09400ACE34F /* object.json.terse */; }; BCB55B051221D09400ACE34F /* a.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A4F1221D09400ACE34F /* a.json */; }; BCB55B061221D09400ACE34F /* a.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A501221D09400ACE34F /* a.json.pretty */; }; BCB55B071221D09400ACE34F /* a.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A511221D09400ACE34F /* a.json.terse */; }; BCB55B081221D09400ACE34F /* b.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A521221D09400ACE34F /* b.json */; }; BCB55B091221D09400ACE34F /* b.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A531221D09400ACE34F /* b.json.pretty */; }; BCB55B0A1221D09400ACE34F /* b.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A541221D09400ACE34F /* b.json.terse */; }; BCB55B0B1221D09400ACE34F /* string-ctrl.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A551221D09400ACE34F /* string-ctrl.json */; }; BCB55B0C1221D09400ACE34F /* string-ctrl.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A561221D09400ACE34F /* string-ctrl.json.pretty */; }; BCB55B0D1221D09400ACE34F /* string-ctrl.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A571221D09400ACE34F /* string-ctrl.json.terse */; }; BCB55B0E1221D09400ACE34F /* string-unicode.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A581221D09400ACE34F /* string-unicode.json */; }; BCB55B0F1221D09400ACE34F /* string-unicode.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A591221D09400ACE34F /* string-unicode.json.pretty */; }; BCB55B101221D09400ACE34F /* string-unicode.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A5A1221D09400ACE34F /* string-unicode.json.terse */; }; BCB55B111221D09400ACE34F /* string.json in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A5B1221D09400ACE34F /* string.json */; }; BCB55B121221D09400ACE34F /* string.json.pretty in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A5C1221D09400ACE34F /* string.json.pretty */; }; BCB55B131221D09400ACE34F /* string.json.terse in Resources */ = {isa = PBXBuildFile; fileRef = BCB55A5D1221D09400ACE34F /* string.json.terse */; }; E75716450C96DB530084A449 /* NSObject+SBJSON.h in Headers */ = {isa = PBXBuildFile; fileRef = E75716430C96DB530084A449 /* NSObject+SBJSON.h */; settings = {ATTRIBUTES = (Private, ); }; }; E75716460C96DB530084A449 /* NSObject+SBJSON.m in Sources */ = {isa = PBXBuildFile; fileRef = E75716440C96DB530084A449 /* NSObject+SBJSON.m */; }; E757164D0C96E39B0084A449 /* NSString+SBJSON.h in Headers */ = {isa = PBXBuildFile; fileRef = E757164B0C96E39B0084A449 /* NSString+SBJSON.h */; settings = {ATTRIBUTES = (Private, ); }; }; E757164E0C96E39B0084A449 /* NSString+SBJSON.m in Sources */ = {isa = PBXBuildFile; fileRef = E757164C0C96E39B0084A449 /* NSString+SBJSON.m */; }; E76A1EBD0C996EFD00A0CC83 /* DataDrivenTest.m in Sources */ = {isa = PBXBuildFile; fileRef = E76A1EB60C996C2000A0CC83 /* DataDrivenTest.m */; }; FE2BBD860D8B0D6000184787 /* JSON.h in Headers */ = {isa = PBXBuildFile; fileRef = 53D2299A0C96129800276605 /* JSON.h */; settings = {ATTRIBUTES = (Public, ); }; }; FE2BBD870D8B0D6000184787 /* NSObject+SBJSON.h in Headers */ = {isa = PBXBuildFile; fileRef = E75716430C96DB530084A449 /* NSObject+SBJSON.h */; settings = {ATTRIBUTES = (Private, ); }; }; FE2BBD880D8B0D6000184787 /* NSObject+SBJSON.m in Sources */ = {isa = PBXBuildFile; fileRef = E75716440C96DB530084A449 /* NSObject+SBJSON.m */; }; FE2BBD8B0D8B0D6000184787 /* NSString+SBJSON.h in Headers */ = {isa = PBXBuildFile; fileRef = E757164B0C96E39B0084A449 /* NSString+SBJSON.h */; settings = {ATTRIBUTES = (Private, ); }; }; FE2BBD8C0D8B0D6000184787 /* NSString+SBJSON.m in Sources */ = {isa = PBXBuildFile; fileRef = E757164C0C96E39B0084A449 /* NSString+SBJSON.m */; }; FE2BBDB60D8B0F1D00184787 /* DataDrivenTest.m in Sources */ = {isa = PBXBuildFile; fileRef = E76A1EB60C996C2000A0CC83 /* DataDrivenTest.m */; }; FE2BBDB70D8B0F1D00184787 /* ErrorTest.m in Sources */ = {isa = PBXBuildFile; fileRef = 53C45B9B0C98A87600546F66 /* ErrorTest.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ 53D229920C96122E00276605 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 53D229730C9611FF00276605 /* Project object */; proxyType = 1; remoteGlobalIDString = 53D229800C96121600276605; remoteInfo = JSON; }; FE2BBDB30D8B0F0F00184787 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 53D229730C9611FF00276605 /* Project object */; proxyType = 1; remoteGlobalIDString = FE2BBD7F0D8B0D3900184787; remoteInfo = json; }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ 535157780F6E3BE100C8AABD /* SBJsonParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SBJsonParser.h; sourceTree = ""; }; 535157790F6E3BE100C8AABD /* SBJsonParser.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SBJsonParser.m; sourceTree = ""; }; 535157A30F6EE4A800C8AABD /* SBJsonWriter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SBJsonWriter.h; sourceTree = ""; }; 535157A40F6EE4A800C8AABD /* SBJsonWriter.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SBJsonWriter.m; sourceTree = ""; }; 5351586F0F70DE7A00C8AABD /* SBJsonBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SBJsonBase.h; sourceTree = ""; }; 535158720F70DE7B00C8AABD /* SBJsonBase.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SBJsonBase.m; sourceTree = ""; }; 5355C86B0E392B2A00A18C15 /* ErrorTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ErrorTest.h; sourceTree = ""; }; 5355C86C0E392B2A00A18C15 /* DataDrivenTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DataDrivenTest.h; sourceTree = ""; }; 53C45B9B0C98A87600546F66 /* ErrorTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ErrorTest.m; sourceTree = ""; }; 53D229810C96121600276605 /* JSON.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = JSON.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 53D229830C96121600276605 /* JSON-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "JSON-Info.plist"; sourceTree = ""; }; 53D2298D0C96122A00276605 /* Tests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Tests.octest; sourceTree = BUILT_PRODUCTS_DIR; }; 53D2298E0C96122A00276605 /* Tests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Tests-Info.plist"; sourceTree = ""; }; 53D2299A0C96129800276605 /* JSON.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSON.h; sourceTree = ""; }; BC010B181248A5E400ACC736 /* RefreshOnlineDocs.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = RefreshOnlineDocs.sh; sourceTree = ""; }; BC0387E611CEC07A0080C552 /* AbstractTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AbstractTest.h; sourceTree = ""; }; BC0387E711CEC07A0080C552 /* AbstractTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AbstractTest.m; sourceTree = ""; }; BC3A1CDC12060DAC0051A978 /* Changes.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Changes.md; sourceTree = ""; }; BC3A1CDD12060DAC0051A978 /* Credits.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Credits.md; sourceTree = ""; }; BC3A1CDE12060DAC0051A978 /* Installation.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Installation.md; sourceTree = ""; }; BC3A1CDF12060DAC0051A978 /* License.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = License.md; sourceTree = ""; }; BC74B6EA0FC9FAD0000BD3DD /* MaxDepthTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MaxDepthTest.h; sourceTree = ""; }; BC74B6EB0FC9FAD0000BD3DD /* MaxDepthTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MaxDepthTest.m; sourceTree = ""; }; BC74B7AC0FCA8B89000BD3DD /* ProxyTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ProxyTest.h; sourceTree = ""; }; BC74B7AD0FCA8B89000BD3DD /* ProxyTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ProxyTest.m; sourceTree = ""; }; BC8F72A51235331400678720 /* WriterTest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WriterTest.h; sourceTree = ""; }; BC8F72A61235331400678720 /* WriterTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WriterTest.m; sourceTree = ""; }; BCB55A001221D09400ACE34F /* array.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = array.json; sourceTree = ""; }; BCB55A011221D09400ACE34F /* array.json.pretty */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = array.json.pretty; sourceTree = ""; }; BCB55A021221D09400ACE34F /* array.json.terse */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = array.json.terse; sourceTree = ""; }; BCB55A031221D09400ACE34F /* bool.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = bool.json; sourceTree = ""; }; BCB55A041221D09400ACE34F /* bool.json.pretty */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = bool.json.pretty; sourceTree = ""; }; BCB55A051221D09400ACE34F /* bool.json.terse */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = bool.json.terse; sourceTree = ""; }; BCB55A061221D09400ACE34F /* format.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = format.json; sourceTree = ""; }; BCB55A071221D09400ACE34F /* format.json.pretty */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = format.json.pretty; sourceTree = ""; }; BCB55A081221D09400ACE34F /* format.json.terse */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = format.json.terse; sourceTree = ""; }; BCB55A0A1221D09400ACE34F /* 1.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 1.json; sourceTree = ""; }; BCB55A0B1221D09400ACE34F /* 1.json.pretty */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 1.json.pretty; sourceTree = ""; }; BCB55A0C1221D09400ACE34F /* 1.json.terse */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 1.json.terse; sourceTree = ""; }; BCB55A0D1221D09400ACE34F /* 2.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 2.json; sourceTree = ""; }; BCB55A0E1221D09400ACE34F /* 2.json.pretty */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 2.json.pretty; sourceTree = ""; }; BCB55A0F1221D09400ACE34F /* 2.json.terse */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 2.json.terse; sourceTree = ""; }; BCB55A101221D09400ACE34F /* 3.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 3.json; sourceTree = ""; }; BCB55A111221D09400ACE34F /* 3.json.pretty */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 3.json.pretty; sourceTree = ""; }; BCB55A121221D09400ACE34F /* 3.json.terse */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 3.json.terse; sourceTree = ""; }; BCB55A131221D09400ACE34F /* 4.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 4.json; sourceTree = ""; }; BCB55A141221D09400ACE34F /* 4.json.pretty */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 4.json.pretty; sourceTree = ""; }; BCB55A151221D09400ACE34F /* 4.json.terse */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 4.json.terse; sourceTree = ""; }; BCB55A161221D09400ACE34F /* 5.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 5.json; sourceTree = ""; }; BCB55A171221D09400ACE34F /* 5.json.pretty */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 5.json.pretty; sourceTree = ""; }; BCB55A181221D09400ACE34F /* 5.json.terse */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = 5.json.terse; sourceTree = ""; }; BCB55A1A1221D09400ACE34F /* fail1.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fail1.json; sourceTree = ""; }; BCB55A1B1221D09400ACE34F /* fail10.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fail10.json; sourceTree = ""; }; BCB55A1C1221D09400ACE34F /* fail11.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fail11.json; sourceTree = ""; }; BCB55A1D1221D09400ACE34F /* fail12.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fail12.json; sourceTree = ""; }; BCB55A1E1221D09400ACE34F /* fail13.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fail13.json; sourceTree = ""; }; BCB55A1F1221D09400ACE34F /* fail14.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fail14.json; sourceTree = ""; }; BCB55A201221D09400ACE34F /* fail15.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fail15.json; sourceTree = ""; }; BCB55A211221D09400ACE34F /* fail16.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fail16.json; sourceTree = ""; }; BCB55A221221D09400ACE34F /* fail17.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fail17.json; sourceTree = ""; }; BCB55A231221D09400ACE34F /* fail18.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fail18.json; sourceTree = ""; }; BCB55A241221D09400ACE34F /* fail19.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fail19.json; sourceTree = ""; }; BCB55A251221D09400ACE34F /* fail2.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fail2.json; sourceTree = ""; }; BCB55A261221D09400ACE34F /* fail20.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fail20.json; sourceTree = ""; }; BCB55A271221D09400ACE34F /* fail21.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fail21.json; sourceTree = ""; }; BCB55A281221D09400ACE34F /* fail22.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fail22.json; sourceTree = ""; }; BCB55A291221D09400ACE34F /* fail23.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fail23.json; sourceTree = ""; }; BCB55A2A1221D09400ACE34F /* fail24.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fail24.json; sourceTree = ""; }; BCB55A2B1221D09400ACE34F /* fail25.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fail25.json; sourceTree = ""; }; BCB55A2C1221D09400ACE34F /* fail26.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fail26.json; sourceTree = ""; }; BCB55A2D1221D09400ACE34F /* fail27.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fail27.json; sourceTree = ""; }; BCB55A2E1221D09400ACE34F /* fail28.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fail28.json; sourceTree = ""; }; BCB55A2F1221D09400ACE34F /* fail29.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fail29.json; sourceTree = ""; }; BCB55A301221D09400ACE34F /* fail3.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fail3.json; sourceTree = ""; }; BCB55A311221D09400ACE34F /* fail30.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fail30.json; sourceTree = ""; }; BCB55A321221D09400ACE34F /* fail31.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fail31.json; sourceTree = ""; }; BCB55A331221D09400ACE34F /* fail32.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fail32.json; sourceTree = ""; }; BCB55A341221D09400ACE34F /* fail33.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fail33.json; sourceTree = ""; }; BCB55A351221D09400ACE34F /* fail4.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fail4.json; sourceTree = ""; }; BCB55A361221D09400ACE34F /* fail5.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fail5.json; sourceTree = ""; }; BCB55A371221D09400ACE34F /* fail6.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fail6.json; sourceTree = ""; }; BCB55A381221D09400ACE34F /* fail7.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fail7.json; sourceTree = ""; }; BCB55A391221D09400ACE34F /* fail8.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fail8.json; sourceTree = ""; }; BCB55A3A1221D09400ACE34F /* fail9.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = fail9.json; sourceTree = ""; }; BCB55A3B1221D09400ACE34F /* pass1.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = pass1.json; sourceTree = ""; }; BCB55A3C1221D09400ACE34F /* pass1.json.pretty */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = pass1.json.pretty; sourceTree = ""; }; BCB55A3D1221D09400ACE34F /* pass1.json.terse */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = pass1.json.terse; sourceTree = ""; }; BCB55A3E1221D09400ACE34F /* pass2.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = pass2.json; sourceTree = ""; }; BCB55A3F1221D09400ACE34F /* pass2.json.pretty */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = pass2.json.pretty; sourceTree = ""; }; BCB55A401221D09400ACE34F /* pass2.json.terse */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = pass2.json.terse; sourceTree = ""; }; BCB55A411221D09400ACE34F /* pass3.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = pass3.json; sourceTree = ""; }; BCB55A421221D09400ACE34F /* pass3.json.pretty */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = pass3.json.pretty; sourceTree = ""; }; BCB55A431221D09400ACE34F /* pass3.json.terse */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = pass3.json.terse; sourceTree = ""; }; BCB55A441221D09400ACE34F /* null.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = null.json; sourceTree = ""; }; BCB55A451221D09400ACE34F /* null.json.pretty */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = null.json.pretty; sourceTree = ""; }; BCB55A461221D09400ACE34F /* null.json.terse */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = null.json.terse; sourceTree = ""; }; BCB55A471221D09400ACE34F /* number.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = number.json; sourceTree = ""; }; BCB55A481221D09400ACE34F /* number.json.pretty */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = number.json.pretty; sourceTree = ""; }; BCB55A491221D09400ACE34F /* number.json.terse */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = number.json.terse; sourceTree = ""; }; BCB55A4A1221D09400ACE34F /* object.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = object.json; sourceTree = ""; }; BCB55A4B1221D09400ACE34F /* object.json.pretty */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = object.json.pretty; sourceTree = ""; }; BCB55A4C1221D09400ACE34F /* object.json.terse */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = object.json.terse; sourceTree = ""; }; BCB55A4F1221D09400ACE34F /* a.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = a.json; sourceTree = ""; }; BCB55A501221D09400ACE34F /* a.json.pretty */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = a.json.pretty; sourceTree = ""; }; BCB55A511221D09400ACE34F /* a.json.terse */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = a.json.terse; sourceTree = ""; }; BCB55A521221D09400ACE34F /* b.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = b.json; sourceTree = ""; }; BCB55A531221D09400ACE34F /* b.json.pretty */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = b.json.pretty; sourceTree = ""; }; BCB55A541221D09400ACE34F /* b.json.terse */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = b.json.terse; sourceTree = ""; }; BCB55A551221D09400ACE34F /* string-ctrl.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "string-ctrl.json"; sourceTree = ""; }; BCB55A561221D09400ACE34F /* string-ctrl.json.pretty */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "string-ctrl.json.pretty"; sourceTree = ""; }; BCB55A571221D09400ACE34F /* string-ctrl.json.terse */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "string-ctrl.json.terse"; sourceTree = ""; }; BCB55A581221D09400ACE34F /* string-unicode.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "string-unicode.json"; sourceTree = ""; }; BCB55A591221D09400ACE34F /* string-unicode.json.pretty */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "string-unicode.json.pretty"; sourceTree = ""; }; BCB55A5A1221D09400ACE34F /* string-unicode.json.terse */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "string-unicode.json.terse"; sourceTree = ""; }; BCB55A5B1221D09400ACE34F /* string.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = string.json; sourceTree = ""; }; BCB55A5C1221D09400ACE34F /* string.json.pretty */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = string.json.pretty; sourceTree = ""; }; BCB55A5D1221D09400ACE34F /* string.json.terse */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = string.json.terse; sourceTree = ""; }; BCB55B411221D4B800ACE34F /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README; sourceTree = ""; }; BCB55B421221D4E200ACE34F /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README; sourceTree = ""; }; BCB55B441221D50500ACE34F /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README; sourceTree = ""; }; BCC0466C0FB62CF100F9F2D3 /* Readme.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Readme.md; sourceTree = ""; }; BCC047320FB6584C00F9F2D3 /* InstallDocumentation.sh */ = {isa = PBXFileReference; explicitFileType = text.script.sh; fileEncoding = 4; path = InstallDocumentation.sh; sourceTree = ""; }; E75716430C96DB530084A449 /* NSObject+SBJSON.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSObject+SBJSON.h"; sourceTree = ""; }; E75716440C96DB530084A449 /* NSObject+SBJSON.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSObject+SBJSON.m"; sourceTree = ""; }; E757164B0C96E39B0084A449 /* NSString+SBJSON.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSString+SBJSON.h"; sourceTree = ""; }; E757164C0C96E39B0084A449 /* NSString+SBJSON.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSString+SBJSON.m"; sourceTree = ""; }; E76A1EB60C996C2000A0CC83 /* DataDrivenTest.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DataDrivenTest.m; sourceTree = ""; }; FE2BBD800D8B0D3900184787 /* libjson.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libjson.a; sourceTree = BUILT_PRODUCTS_DIR; }; FE2BBDAB0D8B0EE000184787 /* libjsontests.octest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = libjsontests.octest; sourceTree = BUILT_PRODUCTS_DIR; }; FE2BBDAC0D8B0EE100184787 /* libjsontests-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "libjsontests-Info.plist"; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ 53D2297F0C96121600276605 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 53D2298A0C96122A00276605 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 53D229AD0C961B9900276605 /* JSON.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; FE2BBD7E0D8B0D3900184787 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; FE2BBDA80D8B0EE000184787 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( 53F8A8150E57158200355C72 /* libjson.a in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ 53D229710C9611FF00276605 = { isa = PBXGroup; children = ( 53D229950C96123C00276605 /* Classes */, 53D229960C96124500276605 /* Tests */, BCB559FF1221D09300ACE34F /* Test Data */, 53D229820C96121600276605 /* Products */, BCC0465E0FB62C2B00F9F2D3 /* Resources */, BCC047D30FB742FC00F9F2D3 /* Documents */, BCC046DF0FB6478C00F9F2D3 /* Scripts */, ); sourceTree = ""; }; 53D229820C96121600276605 /* Products */ = { isa = PBXGroup; children = ( 53D229810C96121600276605 /* JSON.framework */, 53D2298D0C96122A00276605 /* Tests.octest */, FE2BBD800D8B0D3900184787 /* libjson.a */, FE2BBDAB0D8B0EE000184787 /* libjsontests.octest */, ); name = Products; sourceTree = ""; }; 53D229950C96123C00276605 /* Classes */ = { isa = PBXGroup; children = ( 53D2299A0C96129800276605 /* JSON.h */, E75716430C96DB530084A449 /* NSObject+SBJSON.h */, E75716440C96DB530084A449 /* NSObject+SBJSON.m */, E757164B0C96E39B0084A449 /* NSString+SBJSON.h */, E757164C0C96E39B0084A449 /* NSString+SBJSON.m */, 5351586F0F70DE7A00C8AABD /* SBJsonBase.h */, 535158720F70DE7B00C8AABD /* SBJsonBase.m */, 535157780F6E3BE100C8AABD /* SBJsonParser.h */, 535157790F6E3BE100C8AABD /* SBJsonParser.m */, 535157A30F6EE4A800C8AABD /* SBJsonWriter.h */, 535157A40F6EE4A800C8AABD /* SBJsonWriter.m */, ); path = Classes; sourceTree = ""; }; 53D229960C96124500276605 /* Tests */ = { isa = PBXGroup; children = ( BC0387E611CEC07A0080C552 /* AbstractTest.h */, BC0387E711CEC07A0080C552 /* AbstractTest.m */, 5355C86C0E392B2A00A18C15 /* DataDrivenTest.h */, E76A1EB60C996C2000A0CC83 /* DataDrivenTest.m */, 5355C86B0E392B2A00A18C15 /* ErrorTest.h */, 53C45B9B0C98A87600546F66 /* ErrorTest.m */, BC74B6EA0FC9FAD0000BD3DD /* MaxDepthTest.h */, BC74B6EB0FC9FAD0000BD3DD /* MaxDepthTest.m */, BC74B7AC0FCA8B89000BD3DD /* ProxyTest.h */, BC74B7AD0FCA8B89000BD3DD /* ProxyTest.m */, BC8F72A51235331400678720 /* WriterTest.h */, BC8F72A61235331400678720 /* WriterTest.m */, ); path = Tests; sourceTree = ""; }; BCB559FF1221D09300ACE34F /* Test Data */ = { isa = PBXGroup; children = ( BCB55A001221D09400ACE34F /* array.json */, BCB55A011221D09400ACE34F /* array.json.pretty */, BCB55A021221D09400ACE34F /* array.json.terse */, BCB55A031221D09400ACE34F /* bool.json */, BCB55A041221D09400ACE34F /* bool.json.pretty */, BCB55A051221D09400ACE34F /* bool.json.terse */, BCB55A061221D09400ACE34F /* format.json */, BCB55A071221D09400ACE34F /* format.json.pretty */, BCB55A081221D09400ACE34F /* format.json.terse */, BCB55A091221D09400ACE34F /* json.org */, BCB55A191221D09400ACE34F /* jsonchecker */, BCB55A441221D09400ACE34F /* null.json */, BCB55A451221D09400ACE34F /* null.json.pretty */, BCB55A461221D09400ACE34F /* null.json.terse */, BCB55A471221D09400ACE34F /* number.json */, BCB55A481221D09400ACE34F /* number.json.pretty */, BCB55A491221D09400ACE34F /* number.json.terse */, BCB55A4A1221D09400ACE34F /* object.json */, BCB55A4B1221D09400ACE34F /* object.json.pretty */, BCB55A4C1221D09400ACE34F /* object.json.terse */, BCB55A4E1221D09400ACE34F /* rfc4627 */, BCB55A551221D09400ACE34F /* string-ctrl.json */, BCB55A561221D09400ACE34F /* string-ctrl.json.pretty */, BCB55A571221D09400ACE34F /* string-ctrl.json.terse */, BCB55A581221D09400ACE34F /* string-unicode.json */, BCB55A591221D09400ACE34F /* string-unicode.json.pretty */, BCB55A5A1221D09400ACE34F /* string-unicode.json.terse */, BCB55A5B1221D09400ACE34F /* string.json */, BCB55A5C1221D09400ACE34F /* string.json.pretty */, BCB55A5D1221D09400ACE34F /* string.json.terse */, ); name = "Test Data"; path = Tests/Data; sourceTree = ""; }; BCB55A091221D09400ACE34F /* json.org */ = { isa = PBXGroup; children = ( BCB55A0A1221D09400ACE34F /* 1.json */, BCB55A0B1221D09400ACE34F /* 1.json.pretty */, BCB55A0C1221D09400ACE34F /* 1.json.terse */, BCB55A0D1221D09400ACE34F /* 2.json */, BCB55A0E1221D09400ACE34F /* 2.json.pretty */, BCB55A0F1221D09400ACE34F /* 2.json.terse */, BCB55A101221D09400ACE34F /* 3.json */, BCB55A111221D09400ACE34F /* 3.json.pretty */, BCB55A121221D09400ACE34F /* 3.json.terse */, BCB55A131221D09400ACE34F /* 4.json */, BCB55A141221D09400ACE34F /* 4.json.pretty */, BCB55A151221D09400ACE34F /* 4.json.terse */, BCB55A161221D09400ACE34F /* 5.json */, BCB55A171221D09400ACE34F /* 5.json.pretty */, BCB55A181221D09400ACE34F /* 5.json.terse */, BCB55B411221D4B800ACE34F /* README */, ); path = json.org; sourceTree = ""; }; BCB55A191221D09400ACE34F /* jsonchecker */ = { isa = PBXGroup; children = ( BCB55A1A1221D09400ACE34F /* fail1.json */, BCB55A1B1221D09400ACE34F /* fail10.json */, BCB55A1C1221D09400ACE34F /* fail11.json */, BCB55A1D1221D09400ACE34F /* fail12.json */, BCB55A1E1221D09400ACE34F /* fail13.json */, BCB55A1F1221D09400ACE34F /* fail14.json */, BCB55A201221D09400ACE34F /* fail15.json */, BCB55A211221D09400ACE34F /* fail16.json */, BCB55A221221D09400ACE34F /* fail17.json */, BCB55A231221D09400ACE34F /* fail18.json */, BCB55A241221D09400ACE34F /* fail19.json */, BCB55A251221D09400ACE34F /* fail2.json */, BCB55A261221D09400ACE34F /* fail20.json */, BCB55A271221D09400ACE34F /* fail21.json */, BCB55A281221D09400ACE34F /* fail22.json */, BCB55A291221D09400ACE34F /* fail23.json */, BCB55A2A1221D09400ACE34F /* fail24.json */, BCB55A2B1221D09400ACE34F /* fail25.json */, BCB55A2C1221D09400ACE34F /* fail26.json */, BCB55A2D1221D09400ACE34F /* fail27.json */, BCB55A2E1221D09400ACE34F /* fail28.json */, BCB55A2F1221D09400ACE34F /* fail29.json */, BCB55A301221D09400ACE34F /* fail3.json */, BCB55A311221D09400ACE34F /* fail30.json */, BCB55A321221D09400ACE34F /* fail31.json */, BCB55A331221D09400ACE34F /* fail32.json */, BCB55A341221D09400ACE34F /* fail33.json */, BCB55A351221D09400ACE34F /* fail4.json */, BCB55A361221D09400ACE34F /* fail5.json */, BCB55A371221D09400ACE34F /* fail6.json */, BCB55A381221D09400ACE34F /* fail7.json */, BCB55A391221D09400ACE34F /* fail8.json */, BCB55A3A1221D09400ACE34F /* fail9.json */, BCB55A3B1221D09400ACE34F /* pass1.json */, BCB55A3C1221D09400ACE34F /* pass1.json.pretty */, BCB55A3D1221D09400ACE34F /* pass1.json.terse */, BCB55A3E1221D09400ACE34F /* pass2.json */, BCB55A3F1221D09400ACE34F /* pass2.json.pretty */, BCB55A401221D09400ACE34F /* pass2.json.terse */, BCB55A411221D09400ACE34F /* pass3.json */, BCB55A421221D09400ACE34F /* pass3.json.pretty */, BCB55A431221D09400ACE34F /* pass3.json.terse */, BCB55B421221D4E200ACE34F /* README */, ); path = jsonchecker; sourceTree = ""; }; BCB55A4E1221D09400ACE34F /* rfc4627 */ = { isa = PBXGroup; children = ( BCB55A4F1221D09400ACE34F /* a.json */, BCB55A501221D09400ACE34F /* a.json.pretty */, BCB55A511221D09400ACE34F /* a.json.terse */, BCB55A521221D09400ACE34F /* b.json */, BCB55A531221D09400ACE34F /* b.json.pretty */, BCB55A541221D09400ACE34F /* b.json.terse */, BCB55B441221D50500ACE34F /* README */, ); path = rfc4627; sourceTree = ""; }; BCC0465E0FB62C2B00F9F2D3 /* Resources */ = { isa = PBXGroup; children = ( 53D229830C96121600276605 /* JSON-Info.plist */, 53D2298E0C96122A00276605 /* Tests-Info.plist */, FE2BBDAC0D8B0EE100184787 /* libjsontests-Info.plist */, ); name = Resources; sourceTree = ""; }; BCC046DF0FB6478C00F9F2D3 /* Scripts */ = { isa = PBXGroup; children = ( BC010B181248A5E400ACC736 /* RefreshOnlineDocs.sh */, BCC047320FB6584C00F9F2D3 /* InstallDocumentation.sh */, ); path = Scripts; sourceTree = ""; }; BCC047D30FB742FC00F9F2D3 /* Documents */ = { isa = PBXGroup; children = ( BC3A1CDC12060DAC0051A978 /* Changes.md */, BC3A1CDD12060DAC0051A978 /* Credits.md */, BC3A1CDE12060DAC0051A978 /* Installation.md */, BC3A1CDF12060DAC0051A978 /* License.md */, BCC0466C0FB62CF100F9F2D3 /* Readme.md */, ); name = Documents; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ 53D2297C0C96121600276605 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( 53D2299C0C96129800276605 /* JSON.h in Headers */, E75716450C96DB530084A449 /* NSObject+SBJSON.h in Headers */, E757164D0C96E39B0084A449 /* NSString+SBJSON.h in Headers */, 5351577C0F6E3BE100C8AABD /* SBJsonParser.h in Headers */, 535157A70F6EE4A800C8AABD /* SBJsonWriter.h in Headers */, 535158700F70DE7A00C8AABD /* SBJsonBase.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; FE2BBD7C0D8B0D3900184787 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( FE2BBD860D8B0D6000184787 /* JSON.h in Headers */, FE2BBD870D8B0D6000184787 /* NSObject+SBJSON.h in Headers */, FE2BBD8B0D8B0D6000184787 /* NSString+SBJSON.h in Headers */, 5351577A0F6E3BE100C8AABD /* SBJsonParser.h in Headers */, 535157A50F6EE4A800C8AABD /* SBJsonWriter.h in Headers */, 535158710F70DE7A00C8AABD /* SBJsonBase.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ 53D229800C96121600276605 /* JSON */ = { isa = PBXNativeTarget; buildConfigurationList = 53D229850C96121700276605 /* Build configuration list for PBXNativeTarget "JSON" */; buildPhases = ( BC5BC69F1249767600F22EB0 /* ShellScript */, 53D2297C0C96121600276605 /* Headers */, 53D2297D0C96121600276605 /* Resources */, 53D2297E0C96121600276605 /* Sources */, 53D2297F0C96121600276605 /* Frameworks */, BC5BC6BE1249E3E500F22EB0 /* ShellScript */, ); buildRules = ( ); dependencies = ( ); name = JSON; productName = JSON; productReference = 53D229810C96121600276605 /* JSON.framework */; productType = "com.apple.product-type.framework"; }; 53D2298C0C96122A00276605 /* Tests */ = { isa = PBXNativeTarget; buildConfigurationList = 53D2298F0C96122A00276605 /* Build configuration list for PBXNativeTarget "Tests" */; buildPhases = ( 53D229880C96122A00276605 /* Resources */, 53D229890C96122A00276605 /* Sources */, 53D2298A0C96122A00276605 /* Frameworks */, 53D2298B0C96122A00276605 /* ShellScript */, ); buildRules = ( ); dependencies = ( 53D229930C96122E00276605 /* PBXTargetDependency */, ); name = Tests; productName = Tests; productReference = 53D2298D0C96122A00276605 /* Tests.octest */; productType = "com.apple.product-type.bundle"; }; FE2BBD7F0D8B0D3900184787 /* libjson */ = { isa = PBXNativeTarget; buildConfigurationList = FE2BBD950D8B0DC900184787 /* Build configuration list for PBXNativeTarget "libjson" */; buildPhases = ( BC5BC69F1249767600F22EB1 /* ShellScript */, FE2BBD7C0D8B0D3900184787 /* Headers */, FE2BBD7D0D8B0D3900184787 /* Sources */, FE2BBD7E0D8B0D3900184787 /* Frameworks */, BC5BC6BE1249E3E500F22EB1 /* ShellScript */, ); buildRules = ( ); dependencies = ( ); name = libjson; productName = json; productReference = FE2BBD800D8B0D3900184787 /* libjson.a */; productType = "com.apple.product-type.library.static"; }; FE2BBDAA0D8B0EE000184787 /* libjsontests */ = { isa = PBXNativeTarget; buildConfigurationList = FE2BBDAF0D8B0EE100184787 /* Build configuration list for PBXNativeTarget "libjsontests" */; buildPhases = ( FE2BBDA60D8B0EE000184787 /* Resources */, FE2BBDA70D8B0EE000184787 /* Sources */, FE2BBDA80D8B0EE000184787 /* Frameworks */, FE2BBDA90D8B0EE000184787 /* ShellScript */, ); buildRules = ( ); dependencies = ( FE2BBDB40D8B0F0F00184787 /* PBXTargetDependency */, ); name = libjsontests; productName = libjsontests; productReference = FE2BBDAB0D8B0EE000184787 /* libjsontests.octest */; productType = "com.apple.product-type.bundle"; }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ 53D229730C9611FF00276605 /* Project object */ = { isa = PBXProject; buildConfigurationList = 53D229740C9611FF00276605 /* Build configuration list for PBXProject "JSON" */; compatibilityVersion = "Xcode 3.2"; hasScannedForEncodings = 0; mainGroup = 53D229710C9611FF00276605; productRefGroup = 53D229820C96121600276605 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 53D229800C96121600276605 /* JSON */, 53D2298C0C96122A00276605 /* Tests */, FE2BBD7F0D8B0D3900184787 /* libjson */, FE2BBDAA0D8B0EE000184787 /* libjsontests */, BCC047160FB651AF00F9F2D3 /* Documentation */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ 53D2297D0C96121600276605 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; 53D229880C96122A00276605 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( BCB55A5E1221D09400ACE34F /* array.json in Resources */, BCB55A5F1221D09400ACE34F /* array.json.pretty in Resources */, BCB55A601221D09400ACE34F /* array.json.terse in Resources */, BCB55A611221D09400ACE34F /* bool.json in Resources */, BCB55A621221D09400ACE34F /* bool.json.pretty in Resources */, BCB55A631221D09400ACE34F /* bool.json.terse in Resources */, BCB55A641221D09400ACE34F /* format.json in Resources */, BCB55A651221D09400ACE34F /* format.json.pretty in Resources */, BCB55A661221D09400ACE34F /* format.json.terse in Resources */, BCB55A671221D09400ACE34F /* 1.json in Resources */, BCB55A681221D09400ACE34F /* 1.json.pretty in Resources */, BCB55A691221D09400ACE34F /* 1.json.terse in Resources */, BCB55A6A1221D09400ACE34F /* 2.json in Resources */, BCB55A6B1221D09400ACE34F /* 2.json.pretty in Resources */, BCB55A6C1221D09400ACE34F /* 2.json.terse in Resources */, BCB55A6D1221D09400ACE34F /* 3.json in Resources */, BCB55A6E1221D09400ACE34F /* 3.json.pretty in Resources */, BCB55A6F1221D09400ACE34F /* 3.json.terse in Resources */, BCB55A701221D09400ACE34F /* 4.json in Resources */, BCB55A711221D09400ACE34F /* 4.json.pretty in Resources */, BCB55A721221D09400ACE34F /* 4.json.terse in Resources */, BCB55A731221D09400ACE34F /* 5.json in Resources */, BCB55A741221D09400ACE34F /* 5.json.pretty in Resources */, BCB55A751221D09400ACE34F /* 5.json.terse in Resources */, BCB55A761221D09400ACE34F /* fail1.json in Resources */, BCB55A771221D09400ACE34F /* fail10.json in Resources */, BCB55A781221D09400ACE34F /* fail11.json in Resources */, BCB55A791221D09400ACE34F /* fail12.json in Resources */, BCB55A7A1221D09400ACE34F /* fail13.json in Resources */, BCB55A7B1221D09400ACE34F /* fail14.json in Resources */, BCB55A7C1221D09400ACE34F /* fail15.json in Resources */, BCB55A7D1221D09400ACE34F /* fail16.json in Resources */, BCB55A7E1221D09400ACE34F /* fail17.json in Resources */, BCB55A7F1221D09400ACE34F /* fail18.json in Resources */, BCB55A801221D09400ACE34F /* fail19.json in Resources */, BCB55A811221D09400ACE34F /* fail2.json in Resources */, BCB55A821221D09400ACE34F /* fail20.json in Resources */, BCB55A831221D09400ACE34F /* fail21.json in Resources */, BCB55A841221D09400ACE34F /* fail22.json in Resources */, BCB55A851221D09400ACE34F /* fail23.json in Resources */, BCB55A861221D09400ACE34F /* fail24.json in Resources */, BCB55A871221D09400ACE34F /* fail25.json in Resources */, BCB55A881221D09400ACE34F /* fail26.json in Resources */, BCB55A891221D09400ACE34F /* fail27.json in Resources */, BCB55A8A1221D09400ACE34F /* fail28.json in Resources */, BCB55A8B1221D09400ACE34F /* fail29.json in Resources */, BCB55A8C1221D09400ACE34F /* fail3.json in Resources */, BCB55A8D1221D09400ACE34F /* fail30.json in Resources */, BCB55A8E1221D09400ACE34F /* fail31.json in Resources */, BCB55A8F1221D09400ACE34F /* fail32.json in Resources */, BCB55A901221D09400ACE34F /* fail33.json in Resources */, BCB55A911221D09400ACE34F /* fail4.json in Resources */, BCB55A921221D09400ACE34F /* fail5.json in Resources */, BCB55A931221D09400ACE34F /* fail6.json in Resources */, BCB55A941221D09400ACE34F /* fail7.json in Resources */, BCB55A951221D09400ACE34F /* fail8.json in Resources */, BCB55A961221D09400ACE34F /* fail9.json in Resources */, BCB55A971221D09400ACE34F /* pass1.json in Resources */, BCB55A981221D09400ACE34F /* pass1.json.pretty in Resources */, BCB55A991221D09400ACE34F /* pass1.json.terse in Resources */, BCB55A9A1221D09400ACE34F /* pass2.json in Resources */, BCB55A9B1221D09400ACE34F /* pass2.json.pretty in Resources */, BCB55A9C1221D09400ACE34F /* pass2.json.terse in Resources */, BCB55A9D1221D09400ACE34F /* pass3.json in Resources */, BCB55A9E1221D09400ACE34F /* pass3.json.pretty in Resources */, BCB55A9F1221D09400ACE34F /* pass3.json.terse in Resources */, BCB55AA01221D09400ACE34F /* null.json in Resources */, BCB55AA11221D09400ACE34F /* null.json.pretty in Resources */, BCB55AA21221D09400ACE34F /* null.json.terse in Resources */, BCB55AA31221D09400ACE34F /* number.json in Resources */, BCB55AA41221D09400ACE34F /* number.json.pretty in Resources */, BCB55AA51221D09400ACE34F /* number.json.terse in Resources */, BCB55AA61221D09400ACE34F /* object.json in Resources */, BCB55AA71221D09400ACE34F /* object.json.pretty in Resources */, BCB55AA81221D09400ACE34F /* object.json.terse in Resources */, BCB55AAA1221D09400ACE34F /* a.json in Resources */, BCB55AAB1221D09400ACE34F /* a.json.pretty in Resources */, BCB55AAC1221D09400ACE34F /* a.json.terse in Resources */, BCB55AAD1221D09400ACE34F /* b.json in Resources */, BCB55AAE1221D09400ACE34F /* b.json.pretty in Resources */, BCB55AAF1221D09400ACE34F /* b.json.terse in Resources */, BCB55AB01221D09400ACE34F /* string-ctrl.json in Resources */, BCB55AB11221D09400ACE34F /* string-ctrl.json.pretty in Resources */, BCB55AB21221D09400ACE34F /* string-ctrl.json.terse in Resources */, BCB55AB31221D09400ACE34F /* string-unicode.json in Resources */, BCB55AB41221D09400ACE34F /* string-unicode.json.pretty in Resources */, BCB55AB51221D09400ACE34F /* string-unicode.json.terse in Resources */, BCB55AB61221D09400ACE34F /* string.json in Resources */, BCB55AB71221D09400ACE34F /* string.json.pretty in Resources */, BCB55AB81221D09400ACE34F /* string.json.terse in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; FE2BBDA60D8B0EE000184787 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( BCB55AB91221D09400ACE34F /* array.json in Resources */, BCB55ABA1221D09400ACE34F /* array.json.pretty in Resources */, BCB55ABB1221D09400ACE34F /* array.json.terse in Resources */, BCB55ABC1221D09400ACE34F /* bool.json in Resources */, BCB55ABD1221D09400ACE34F /* bool.json.pretty in Resources */, BCB55ABE1221D09400ACE34F /* bool.json.terse in Resources */, BCB55ABF1221D09400ACE34F /* format.json in Resources */, BCB55AC01221D09400ACE34F /* format.json.pretty in Resources */, BCB55AC11221D09400ACE34F /* format.json.terse in Resources */, BCB55AC21221D09400ACE34F /* 1.json in Resources */, BCB55AC31221D09400ACE34F /* 1.json.pretty in Resources */, BCB55AC41221D09400ACE34F /* 1.json.terse in Resources */, BCB55AC51221D09400ACE34F /* 2.json in Resources */, BCB55AC61221D09400ACE34F /* 2.json.pretty in Resources */, BCB55AC71221D09400ACE34F /* 2.json.terse in Resources */, BCB55AC81221D09400ACE34F /* 3.json in Resources */, BCB55AC91221D09400ACE34F /* 3.json.pretty in Resources */, BCB55ACA1221D09400ACE34F /* 3.json.terse in Resources */, BCB55ACB1221D09400ACE34F /* 4.json in Resources */, BCB55ACC1221D09400ACE34F /* 4.json.pretty in Resources */, BCB55ACD1221D09400ACE34F /* 4.json.terse in Resources */, BCB55ACE1221D09400ACE34F /* 5.json in Resources */, BCB55ACF1221D09400ACE34F /* 5.json.pretty in Resources */, BCB55AD01221D09400ACE34F /* 5.json.terse in Resources */, BCB55AD11221D09400ACE34F /* fail1.json in Resources */, BCB55AD21221D09400ACE34F /* fail10.json in Resources */, BCB55AD31221D09400ACE34F /* fail11.json in Resources */, BCB55AD41221D09400ACE34F /* fail12.json in Resources */, BCB55AD51221D09400ACE34F /* fail13.json in Resources */, BCB55AD61221D09400ACE34F /* fail14.json in Resources */, BCB55AD71221D09400ACE34F /* fail15.json in Resources */, BCB55AD81221D09400ACE34F /* fail16.json in Resources */, BCB55AD91221D09400ACE34F /* fail17.json in Resources */, BCB55ADA1221D09400ACE34F /* fail18.json in Resources */, BCB55ADB1221D09400ACE34F /* fail19.json in Resources */, BCB55ADC1221D09400ACE34F /* fail2.json in Resources */, BCB55ADD1221D09400ACE34F /* fail20.json in Resources */, BCB55ADE1221D09400ACE34F /* fail21.json in Resources */, BCB55ADF1221D09400ACE34F /* fail22.json in Resources */, BCB55AE01221D09400ACE34F /* fail23.json in Resources */, BCB55AE11221D09400ACE34F /* fail24.json in Resources */, BCB55AE21221D09400ACE34F /* fail25.json in Resources */, BCB55AE31221D09400ACE34F /* fail26.json in Resources */, BCB55AE41221D09400ACE34F /* fail27.json in Resources */, BCB55AE51221D09400ACE34F /* fail28.json in Resources */, BCB55AE61221D09400ACE34F /* fail29.json in Resources */, BCB55AE71221D09400ACE34F /* fail3.json in Resources */, BCB55AE81221D09400ACE34F /* fail30.json in Resources */, BCB55AE91221D09400ACE34F /* fail31.json in Resources */, BCB55AEA1221D09400ACE34F /* fail32.json in Resources */, BCB55AEB1221D09400ACE34F /* fail33.json in Resources */, BCB55AEC1221D09400ACE34F /* fail4.json in Resources */, BCB55AED1221D09400ACE34F /* fail5.json in Resources */, BCB55AEE1221D09400ACE34F /* fail6.json in Resources */, BCB55AEF1221D09400ACE34F /* fail7.json in Resources */, BCB55AF01221D09400ACE34F /* fail8.json in Resources */, BCB55AF11221D09400ACE34F /* fail9.json in Resources */, BCB55AF21221D09400ACE34F /* pass1.json in Resources */, BCB55AF31221D09400ACE34F /* pass1.json.pretty in Resources */, BCB55AF41221D09400ACE34F /* pass1.json.terse in Resources */, BCB55AF51221D09400ACE34F /* pass2.json in Resources */, BCB55AF61221D09400ACE34F /* pass2.json.pretty in Resources */, BCB55AF71221D09400ACE34F /* pass2.json.terse in Resources */, BCB55AF81221D09400ACE34F /* pass3.json in Resources */, BCB55AF91221D09400ACE34F /* pass3.json.pretty in Resources */, BCB55AFA1221D09400ACE34F /* pass3.json.terse in Resources */, BCB55AFB1221D09400ACE34F /* null.json in Resources */, BCB55AFC1221D09400ACE34F /* null.json.pretty in Resources */, BCB55AFD1221D09400ACE34F /* null.json.terse in Resources */, BCB55AFE1221D09400ACE34F /* number.json in Resources */, BCB55AFF1221D09400ACE34F /* number.json.pretty in Resources */, BCB55B001221D09400ACE34F /* number.json.terse in Resources */, BCB55B011221D09400ACE34F /* object.json in Resources */, BCB55B021221D09400ACE34F /* object.json.pretty in Resources */, BCB55B031221D09400ACE34F /* object.json.terse in Resources */, BCB55B051221D09400ACE34F /* a.json in Resources */, BCB55B061221D09400ACE34F /* a.json.pretty in Resources */, BCB55B071221D09400ACE34F /* a.json.terse in Resources */, BCB55B081221D09400ACE34F /* b.json in Resources */, BCB55B091221D09400ACE34F /* b.json.pretty in Resources */, BCB55B0A1221D09400ACE34F /* b.json.terse in Resources */, BCB55B0B1221D09400ACE34F /* string-ctrl.json in Resources */, BCB55B0C1221D09400ACE34F /* string-ctrl.json.pretty in Resources */, BCB55B0D1221D09400ACE34F /* string-ctrl.json.terse in Resources */, BCB55B0E1221D09400ACE34F /* string-unicode.json in Resources */, BCB55B0F1221D09400ACE34F /* string-unicode.json.pretty in Resources */, BCB55B101221D09400ACE34F /* string-unicode.json.terse in Resources */, BCB55B111221D09400ACE34F /* string.json in Resources */, BCB55B121221D09400ACE34F /* string.json.pretty in Resources */, BCB55B131221D09400ACE34F /* string.json.terse in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ 53D2298B0C96122A00276605 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n"; }; BC3A1CB112023B860051A978 /* Refresh Online Docs */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 8; files = ( ); inputPaths = ( ); name = "Refresh Online Docs"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 1; shellPath = /bin/sh; shellScript = "exec $SOURCE_ROOT/Scripts/RefreshOnlineDocs.sh"; }; BC5BC69F1249767600F22EB0 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 12; files = ( ); inputPaths = ( ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "/usr/bin/perl -pi -e 's/#if 1/#if 0/' $SRCROOT/Classes/JSON.h\n"; showEnvVarsInLog = 0; }; BC5BC69F1249767600F22EB1 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 12; files = ( ); inputPaths = ( ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "/usr/bin/perl -pi -e 's/#if 1/#if 0/' $SRCROOT/Classes/JSON.h\n"; showEnvVarsInLog = 0; }; BC5BC6BE1249E3E500F22EB0 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "/usr/bin/perl -pi -e 's/#if 0/#if 1/' $SRCROOT/Classes/JSON.h\n"; showEnvVarsInLog = 0; }; BC5BC6BE1249E3E500F22EB1 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "/usr/bin/perl -pi -e 's/#if 0/#if 1/' $SRCROOT/Classes/JSON.h\n"; showEnvVarsInLog = 0; }; BCC047150FB651AF00F9F2D3 /* Install Docset */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); name = "Install Docset"; outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "exec $SOURCE_ROOT/Scripts/InstallDocumentation.sh"; }; FE2BBDA90D8B0EE000184787 /* ShellScript */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( ); inputPaths = ( ); outputPaths = ( ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; shellScript = "# Run the unit tests in this test bundle.\n\"${SYSTEM_DEVELOPER_DIR}/Tools/RunUnitTests\"\n"; }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ 53D2297E0C96121600276605 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( E75716460C96DB530084A449 /* NSObject+SBJSON.m in Sources */, E757164E0C96E39B0084A449 /* NSString+SBJSON.m in Sources */, 5351577D0F6E3BE100C8AABD /* SBJsonParser.m in Sources */, 535157A80F6EE4A800C8AABD /* SBJsonWriter.m in Sources */, 535158730F70DE7B00C8AABD /* SBJsonBase.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; 53D229890C96122A00276605 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( 53C45B9C0C98A87600546F66 /* ErrorTest.m in Sources */, E76A1EBD0C996EFD00A0CC83 /* DataDrivenTest.m in Sources */, BC74B6ED0FC9FAD0000BD3DD /* MaxDepthTest.m in Sources */, BC74B7AE0FCA8B89000BD3DD /* ProxyTest.m in Sources */, BC0387E911CEC07A0080C552 /* AbstractTest.m in Sources */, BC8F72A71235331400678720 /* WriterTest.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; FE2BBD7D0D8B0D3900184787 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( FE2BBD880D8B0D6000184787 /* NSObject+SBJSON.m in Sources */, FE2BBD8C0D8B0D6000184787 /* NSString+SBJSON.m in Sources */, 5351577B0F6E3BE100C8AABD /* SBJsonParser.m in Sources */, 535157A60F6EE4A800C8AABD /* SBJsonWriter.m in Sources */, 535158740F70DE7B00C8AABD /* SBJsonBase.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; FE2BBDA70D8B0EE000184787 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( FE2BBDB60D8B0F1D00184787 /* DataDrivenTest.m in Sources */, FE2BBDB70D8B0F1D00184787 /* ErrorTest.m in Sources */, BC74B6EC0FC9FAD0000BD3DD /* MaxDepthTest.m in Sources */, BC74B7AF0FCA8B89000BD3DD /* ProxyTest.m in Sources */, BC0387E811CEC07A0080C552 /* AbstractTest.m in Sources */, BC8F72A81235331400678720 /* WriterTest.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ 53D229930C96122E00276605 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = 53D229800C96121600276605 /* JSON */; targetProxy = 53D229920C96122E00276605 /* PBXContainerItemProxy */; }; FE2BBDB40D8B0F0F00184787 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = FE2BBD7F0D8B0D3900184787 /* libjson */; targetProxy = FE2BBDB30D8B0F0F00184787 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ 53D229750C9611FF00276605 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; COPY_PHASE_STRIP = NO; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; ONLY_ACTIVE_ARCH = YES; OTHER_CFLAGS = "-Wparentheses"; }; name = Debug; }; 53D229760C9611FF00276605 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_BIT)"; COPY_PHASE_STRIP = YES; GCC_VERSION = com.apple.compilers.llvm.clang.1_0; OTHER_CFLAGS = "-Wparentheses"; }; name = Release; }; 53D229860C96121700276605 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; CURRENT_PROJECT_VERSION = 11; DYLIB_COMPATIBILITY_VERSION = 4; DYLIB_CURRENT_VERSION = 11; FRAMEWORK_VERSION = A; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_ENABLE_OBJC_GC = supported; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Foundation.framework/Headers/Foundation.h"; GCC_TREAT_WARNINGS_AS_ERRORS = YES; INFOPLIST_FILE = "JSON-Info.plist"; INSTALL_PATH = "@executable_path/../Frameworks"; OTHER_LDFLAGS = ( "-framework", Foundation, ); PREBINDING = NO; PRODUCT_NAME = JSON; SDKROOT = ""; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = SB; }; name = Debug; }; 53D229870C96121700276605 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; CURRENT_PROJECT_VERSION = 11; DYLIB_COMPATIBILITY_VERSION = 4; DYLIB_CURRENT_VERSION = 11; FRAMEWORK_VERSION = A; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_ENABLE_FIX_AND_CONTINUE = NO; GCC_ENABLE_OBJC_GC = supported; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Foundation.framework/Headers/Foundation.h"; GCC_TREAT_WARNINGS_AS_ERRORS = YES; INFOPLIST_FILE = "JSON-Info.plist"; INSTALL_PATH = "@executable_path/../Frameworks"; OTHER_LDFLAGS = ( "-framework", Foundation, ); PREBINDING = NO; PRODUCT_NAME = JSON; SDKROOT = ""; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = SB; }; name = Release; }; 53D229900C96122A00276605 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; COPY_PHASE_STRIP = NO; FRAMEWORK_SEARCH_PATHS = ( "$(value)", "$(DEVELOPER_FRAMEWORKS_DIR_QUOTED)", ); GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = NO; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_ENABLE_OBJC_GC = required; GCC_GENERATE_DEBUGGING_SYMBOLS = YES; GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Foundation.framework/Headers/Foundation.h"; GCC_TREAT_WARNINGS_AS_ERRORS = YES; INFOPLIST_FILE = "Tests-Info.plist"; INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles"; OTHER_LDFLAGS = ( "-framework", Foundation, "-framework", SenTestingKit, ); PREBINDING = NO; PRODUCT_NAME = Tests; SDKROOT = ""; WRAPPER_EXTENSION = octest; }; name = Debug; }; 53D229910C96122A00276605 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; COPY_PHASE_STRIP = YES; FRAMEWORK_SEARCH_PATHS = ( "$(value)", "$(DEVELOPER_FRAMEWORKS_DIR_QUOTED)", ); GCC_C_LANGUAGE_STANDARD = gnu99; GCC_ENABLE_FIX_AND_CONTINUE = NO; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_ENABLE_OBJC_GC = required; GCC_GENERATE_DEBUGGING_SYMBOLS = NO; GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = "$(SYSTEM_LIBRARY_DIR)/Frameworks/Foundation.framework/Headers/Foundation.h"; GCC_TREAT_WARNINGS_AS_ERRORS = YES; INFOPLIST_FILE = "Tests-Info.plist"; INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles"; OTHER_LDFLAGS = ( "-framework", Foundation, "-framework", SenTestingKit, ); PREBINDING = NO; PRODUCT_NAME = Tests; SDKROOT = ""; WRAPPER_EXTENSION = octest; }; name = Release; }; BCC047170FB651AF00F9F2D3 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; PRODUCT_NAME = Documentation; }; name = Debug; }; BCC047180FB651AF00F9F2D3 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; GCC_ENABLE_FIX_AND_CONTINUE = NO; PRODUCT_NAME = Documentation; ZERO_LINK = NO; }; name = Release; }; FE2BBD840D8B0D3900184787 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; COPY_PHASE_STRIP = NO; DEPLOYMENT_LOCATION = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; GCC_ENABLE_OBJC_GC = unsupported; GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_TREAT_WARNINGS_AS_ERRORS = YES; OTHER_LDFLAGS = ( "-framework", Foundation, ); PREBINDING = NO; PRIVATE_HEADERS_FOLDER_PATH = /usr/local/include/JSON; PRODUCT_NAME = json; PUBLIC_HEADERS_FOLDER_PATH = /usr/local/include/JSON; SDKROOT = ""; }; name = Debug; }; FE2BBD850D8B0D3900184787 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; COPY_PHASE_STRIP = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEPLOYMENT_LOCATION = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_ENABLE_FIX_AND_CONTINUE = NO; GCC_ENABLE_OBJC_GC = unsupported; GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_TREAT_WARNINGS_AS_ERRORS = YES; OTHER_LDFLAGS = ( "-framework", Foundation, ); PREBINDING = NO; PRIVATE_HEADERS_FOLDER_PATH = /usr/local/include/JSON; PRODUCT_NAME = json; PUBLIC_HEADERS_FOLDER_PATH = /usr/local/include/JSON; SDKROOT = ""; SKIP_INSTALL = NO; }; name = Release; }; FE2BBDAD0D8B0EE100184787 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; COPY_PHASE_STRIP = NO; FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks"; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = NO; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_ENABLE_OBJC_GC = unsupported; GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_TREAT_WARNINGS_AS_ERRORS = YES; INFOPLIST_FILE = "libjsontests-Info.plist"; INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles"; OTHER_LDFLAGS = ( "-all_load", "-ObjC", "-ljson", "-framework", Foundation, "-framework", SenTestingKit, ); PREBINDING = NO; PRODUCT_NAME = libjsontests; SDKROOT = ""; WRAPPER_EXTENSION = octest; }; name = Debug; }; FE2BBDAE0D8B0EE100184787 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; COPY_PHASE_STRIP = YES; FRAMEWORK_SEARCH_PATHS = "$(DEVELOPER_LIBRARY_DIR)/Frameworks"; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_ENABLE_FIX_AND_CONTINUE = NO; GCC_ENABLE_OBJC_EXCEPTIONS = YES; GCC_ENABLE_OBJC_GC = unsupported; GCC_MODEL_TUNING = G5; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_TREAT_WARNINGS_AS_ERRORS = YES; INFOPLIST_FILE = "libjsontests-Info.plist"; INSTALL_PATH = "$(USER_LIBRARY_DIR)/Bundles"; OTHER_LDFLAGS = ( "-all_load", "-ObjC", "-ljson", "-framework", Foundation, "-framework", SenTestingKit, ); PREBINDING = NO; PRODUCT_NAME = libjsontests; SDKROOT = ""; WRAPPER_EXTENSION = octest; }; name = Release; }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ 53D229740C9611FF00276605 /* Build configuration list for PBXProject "JSON" */ = { isa = XCConfigurationList; buildConfigurations = ( 53D229750C9611FF00276605 /* Debug */, 53D229760C9611FF00276605 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 53D229850C96121700276605 /* Build configuration list for PBXNativeTarget "JSON" */ = { isa = XCConfigurationList; buildConfigurations = ( 53D229860C96121700276605 /* Debug */, 53D229870C96121700276605 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; 53D2298F0C96122A00276605 /* Build configuration list for PBXNativeTarget "Tests" */ = { isa = XCConfigurationList; buildConfigurations = ( 53D229900C96122A00276605 /* Debug */, 53D229910C96122A00276605 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; BCC047190FB651CD00F9F2D3 /* Build configuration list for PBXAggregateTarget "Documentation" */ = { isa = XCConfigurationList; buildConfigurations = ( BCC047170FB651AF00F9F2D3 /* Debug */, BCC047180FB651AF00F9F2D3 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; FE2BBD950D8B0DC900184787 /* Build configuration list for PBXNativeTarget "libjson" */ = { isa = XCConfigurationList; buildConfigurations = ( FE2BBD840D8B0D3900184787 /* Debug */, FE2BBD850D8B0D3900184787 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; FE2BBDAF0D8B0EE100184787 /* Build configuration list for PBXNativeTarget "libjsontests" */ = { isa = XCConfigurationList; buildConfigurations = ( FE2BBDAD0D8B0EE100184787 /* Debug */, FE2BBDAE0D8B0EE100184787 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; rootObject = 53D229730C9611FF00276605 /* Project object */; } sbjson-2.3.2/LICENSE000066400000000000000000000027141151270151400140220ustar00rootroot00000000000000Copyright (C) 2007-2010 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. sbjson-2.3.2/Notes/000077500000000000000000000000001151270151400141015ustar00rootroot00000000000000sbjson-2.3.2/Notes/JensAlfkePerformanceNotes.txt000066400000000000000000000077561151270151400217160ustar00rootroot00000000000000A couple of emails accompanying the patches from Jens Alfke. From: Jens Alfke Date: 13 January 2008 01:01:10 GMT To: stig@brautaset.org Subject: Cocoa JSON optimizations Stig, Thanks for writing the JSON framework for Cocoa! > (Note that both our libraries puts up a really bad show compared to > all the Perl modules Marc measured. A bit embarrassing that...) I took a look at optimizing the generation of JSON. With a couple of tweaks I made it about 11x faster on the large test string from Yahoo. The patch (from SVN top-of-tree) is enclosed. The main problem was that the way the code was structured, with each level of recursion returning its result as a string, results in large numbers of temporary NSStrings being generated and appended to each other. A more optimal pattern for this is to instead pass an NSMutableString to each generator method, which it can append to. That way a single mutable string gets re-used. The next bottleneck was the way -[NSString JSONFragmentWithOptions:] iterates over every character in the string. Getting each character is slow, and appending the characters one at a time to the output is even slower. Fortunately this process is only necessary if the string has characters that need escaping, so I built a static NSCharacterSet of those characters, and then I test every string to see if it contains any of them. If not, it can simply be appended as-is. A lot of strings were still being escaped because they contained "/" characters. I looked at the JSON RFC, and it says that only control characters, double-quotes and backslashes need to be escaped, so I took out the special case for "/". That helped. Finally, I changed the array iterations in the NSArray and NSDictionary methods to use the new Leopard "for...in" syntax (but only if being compiled for Leopard.) That shaved a few percent off the time, since for...in uses a new, more efficient iteration mechanism. I didn't benchmark with any of the pretty-printing options turned on. The code for those could be optimized to reduce the number of string operations; but on the other hand, any client of the library wanting maximum performance is probably going to turn off pretty-printing anyway! If my enthusiasm persists, I might look at the JSON parsing code too, but no promises :) --Jens From: Jens Alfke Date: 13 January 2008 06:15:19 GMT To: stig@brautaset.org Subject: Re: Cocoa JSON optimizations Stig, As promised, I looked at the parser as well. This was trickier to optimize, but by throwing several tricks at it I got a nice 5x speedup. The main problem was just that NSScanner itself is really slow, for some reason. So part of what I did was just to call -scanString: fewer times. I wrote a faster -scanJSONChar: method that scans for a single character, since that's what most of the -scanString: calls were doing. I also changed the top-level scanning sequence so that -scanJSONValue gets the next non-whitespace character and then tests that to see which type of entity to scan. That avoids a bunch of repeated scans for a '{', a '[', a '"', etc. I re-ordered some of the logic in -scanJSONObject: to reduce the number of strings that get scanned for. I restructured -scanJSONString: to append substrings in chunks instead of character-by-character. I also used a lower-level string iterator from CFString that's faster than -characterAtIndex, as well as another CFString function to append unichars to a string. This was fun, actually! Kind of like solving a logic puzzle. I kept on running 'sample' and figuring there must be one more thing I could do to shave off more time... I think there's a bit more room, but it would involve rewriting the code to stop using NSScanner at all. Instead, a couple of fast scan functions based on CFStringInlineBuffer would do the job. I think this would also make the code clearer, since I've left it as a mishmash of NSScanner and direct string access. The source changes were extensive, so the entire file is probably clearer than a diff: --Jens sbjson-2.3.2/Notes/parser-benchmark.txt000066400000000000000000000033701151270151400200710ustar00rootroot00000000000000In this first benchmark I decided to try speeding up the parser by speeding up -[NSScanner scanJSONValue:]. I used the same strings as JSON::XS uses for its benchmarking. The things I tried were: * Firstly, reordering the calls in -[NSScanner scanJSONValue:] to scan for more common (from my subjective point of view) types first. * Further, I wanted to test whether skipping white space before successively trying to match each JSON type would yield a speedup. * Finally, I looked at the next character in the string and did dispatched directly to the correct type. Decoded short/long JSON strings per second (higher is better): | original | reordered | +skip ws | +dispatch | ------+-----------+-----------+----------+-----------| Short | 7468.818 | 7817.630 | 6381.824 | 7626.370 | Long | 110.255 | 117.472 | 106.309 | 110.573 | For the test data I used reordering calls yields a 4.6 to 6.5 percent increase in performance. The new order is approximately the reverse of the original. (The old order was chosen because the right edge of the calls made a pleasant curve, so an improvement here is not unexpected.) The test data has little optional white space, so skipping white space actually turns out to be slower. (Particularly so for short strings.) The white-space skipping is necessary for the dispatching logic. With that added the speed is it back up to about the same as the original. But now the code is uglier and there's more of it. It's my assumption that the performance of parsing human-readable JSON will matter less than the performance of parsing JSON meant for machine consumption. Given this assumption it makes sense to skip the white space skipping and dispatch table, as they make the code more complex. sbjson-2.3.2/Readme.markdown000066400000000000000000000014441151270151400157550ustar00rootroot00000000000000JSON Framework ============== JSON is a light-weight data interchange format that's easy to read and write for humans and computers alike. This framework implements a strict JSON parser and generator in Objective-C. Features -------- * BSD license. * Easy-to-use API. * Strict parsing & generation. * Stack of error available in case of failure so you can easily figure out what is wrong. * Optional pretty-printing of JSON output. * Optionally sorted dictionary keys in JSON output. * Configurable recursion depth for parsing, for added security. Links ----- * The GitHub [project page][src]. * The online [API documentation][api]. * The new [website][web]. [api]: http://stig.github.com/json-framework/api [web]: http://stig.github.com/json-framework [src]: http://github.com/stig/json-framework sbjson-2.3.2/ReleaseChecklist.markdown000066400000000000000000000002201151270151400177610ustar00rootroot00000000000000* Update Changes.markdown * agvtool new-marketing-version XXX * agvtool bump * update website * Refresh API documentation * close fixed tickets sbjson-2.3.2/Scripts/000077500000000000000000000000001151270151400144405ustar00rootroot00000000000000sbjson-2.3.2/Scripts/InstallDocumentation.sh000077500000000000000000000035341151270151400211440ustar00rootroot00000000000000#!/bin/sh # See also http://developer.apple.com/tools/creatingdocsetswithdoxygen.html set -x VERSION=$(agvtool mvers -terse1) DOXYFILE=$DERIVED_FILES_DIR/doxygen.config DOXYGEN=/Applications/Doxygen.app/Contents/Resources/doxygen DOCSET=$INSTALL_DIR/Docset rm -rf $DOCSET mkdir -p $DOCSET || exit 1 mkdir -p $DERIVED_FILES_DIR || exit 1 if ! test -x $DOXYGEN ; then echo "*** Install Doxygen to get documentation generated for you automatically ***" exit 1 fi # Create a doxygen configuration file with only the settings we care about $DOXYGEN -g - > $DOXYFILE cat <> $DOXYFILE PROJECT_NAME = $FULL_PRODUCT_NAME PROJECT_NUMBER = $VERSION OUTPUT_DIRECTORY = $DOCSET INPUT = $SOURCE_ROOT/Classes FILE_PATTERNS = *.h *.m HIDE_UNDOC_MEMBERS = YES HIDE_UNDOC_CLASSES = YES HIDE_UNDOC_RELATIONS = YES REPEAT_BRIEF = NO CASE_SENSE_NAMES = YES INLINE_INHERITED_MEMB = YES SHOW_FILES = NO SHOW_INCLUDE_FILES = NO GENERATE_LATEX = NO SEARCHENGINE = NO GENERATE_HTML = YES GENERATE_DOCSET = YES DOCSET_FEEDNAME = "$PROJECT.framework API Documentation" DOCSET_BUNDLE_ID = org.brautaset.$PROJECT EOF # Run doxygen on the updated config file. # doxygen creates a Makefile that does most of the heavy lifting. $DOXYGEN $DOXYFILE # make will invoke docsetutil. Take a look at the Makefile to see how this is done. make -C $DOCSET/html install # Construct a temporary applescript file to tell Xcode to load a docset. rm -f $TEMP_DIR/loadDocSet.scpt cat < $TEMP_DIR/loadDocSet.scpt tell application "Xcode" load documentation set with path "/Users/$USER/Library/Developer/Shared/Documentation/DocSets/org.brautaset.${PROJECT}.docset/" end tell EOF # Run the load-docset applescript command. osascript $TEMP_DIR/loadDocSet.scpt sbjson-2.3.2/Scripts/RefreshOnlineDocs.sh000077500000000000000000000014131151270151400203520ustar00rootroot00000000000000#!/bin/sh set -x DOCSET=$INSTALL_DIR/Docset/html VERSION=$(agvtool mvers -terse1 | perl -pe 's/(\d\.\d+)(\.\d+)*/$1/') apidir=$VERSION latest=api if ! test -f "$DOCSET/index.html" ; then echo "$dir does not contain index.html" exit 1 fi status=$(git status -s) if ! test -z $status ; then echo "Checkout has uncommitted changes" exit 1 fi tmp=$(basename $0) tmpdir=$(mktemp -d "/tmp/$tmp.XXXXXX") cp -R $DOCSET/ $tmpdir rm -rf $tmpdir/org.brautaset.JSON.docset rm -f $tmpdir/Makefile rm -f $tmpdir/*.xml rm -f $tmpdir/*.plist branch=$(git branch | awk '$1 == "*" { print $2 }' ) git checkout gh-pages rm -f $latest rm -rf $apidir mv $tmpdir $apidir ln -s $apidir $latest git add -A git commit -m "refresh api docs for v$VERSION" git checkout $branch sbjson-2.3.2/Tests-Info.plist000066400000000000000000000011561151270151400160640ustar00rootroot00000000000000 CFBundleDevelopmentRegion English CFBundleExecutable ${EXECUTABLE_NAME} CFBundleIdentifier com.yourcompany.Tests CFBundleInfoDictionaryVersion 6.0 CFBundlePackageType BNDL CFBundleSignature ???? CFBundleVersion 1.0 sbjson-2.3.2/Tests/000077500000000000000000000000001151270151400141135ustar00rootroot00000000000000sbjson-2.3.2/Tests/AbstractTest.h000066400000000000000000000032421151270151400166700ustar00rootroot00000000000000/* Copyright (C) 2010 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 @class SBJsonParser; @class SBJsonWriter; @interface AbstractTest : SenTestCase { SBJsonParser * parser; SBJsonWriter * writer; } @end sbjson-2.3.2/Tests/AbstractTest.m000066400000000000000000000033261151270151400167000ustar00rootroot00000000000000/* Copyright (C) 2010 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 "AbstractTest.h" #import @implementation AbstractTest - (void)setUp { parser = [SBJsonParser new]; writer = [SBJsonWriter new]; } - (void)tearDown { [parser release]; [writer release]; } @end sbjson-2.3.2/Tests/Data/000077500000000000000000000000001151270151400147645ustar00rootroot00000000000000sbjson-2.3.2/Tests/Data/array.json000066400000000000000000000000721151270151400167740ustar00rootroot00000000000000[ [], ["foo"], ["foo",["bar"]], ["foo",["bar",["quux"]]] ]sbjson-2.3.2/Tests/Data/array.json.pretty000066400000000000000000000002241151270151400203210ustar00rootroot00000000000000[ [], [ "foo" ], [ "foo", [ "bar" ] ], [ "foo", [ "bar", [ "quux" ] ] ] ] sbjson-2.3.2/Tests/Data/array.json.terse000066400000000000000000000000661151270151400201200ustar00rootroot00000000000000[[],["foo"],["foo",["bar"]],["foo",["bar",["quux"]]]] sbjson-2.3.2/Tests/Data/bool.json000066400000000000000000000000141151270151400166050ustar00rootroot00000000000000[true,false]sbjson-2.3.2/Tests/Data/bool.json.pretty000066400000000000000000000000241151270151400201340ustar00rootroot00000000000000[ true, false ] sbjson-2.3.2/Tests/Data/bool.json.terse000066400000000000000000000000151151270151400177270ustar00rootroot00000000000000[true,false] sbjson-2.3.2/Tests/Data/format.json000066400000000000000000000000671151270151400171520ustar00rootroot00000000000000["one",2,{"foo":null,"quux":true,"bar":[1, 2, []]},{}] sbjson-2.3.2/Tests/Data/format.json.pretty000066400000000000000000000001641151270151400204760ustar00rootroot00000000000000[ "one", 2, { "bar" : [ 1, 2, [] ], "foo" : null, "quux" : true }, {} ] sbjson-2.3.2/Tests/Data/format.json.terse000066400000000000000000000000651151270151400202710ustar00rootroot00000000000000["one",2,{"bar":[1,2,[]],"foo":null,"quux":true},{}] sbjson-2.3.2/Tests/Data/json.org/000077500000000000000000000000001151270151400165235ustar00rootroot00000000000000sbjson-2.3.2/Tests/Data/json.org/1.json000066400000000000000000000013021151270151400175520ustar00rootroot00000000000000{ "glossary": { "title": "example glossary", "GlossDiv": { "title": "S", "GlossList": { "GlossEntry": { "ID": "SGML", "SortAs": "SGML", "GlossTerm": "Standard Generalized Markup Language", "Acronym": "SGML", "Abbrev": "ISO 8879:1986", "GlossDef": { "para": "A meta-markup language, used to create markup languages such as DocBook.", "GlossSeeAlso": ["GML", "XML"] }, "GlossSee": "markup" } } } } } sbjson-2.3.2/Tests/Data/json.org/1.json.pretty000066400000000000000000000011411151270151400211010ustar00rootroot00000000000000{ "glossary" : { "GlossDiv" : { "GlossList" : { "GlossEntry" : { "Abbrev" : "ISO 8879:1986", "Acronym" : "SGML", "GlossDef" : { "GlossSeeAlso" : [ "GML", "XML" ], "para" : "A meta-markup language, used to create markup languages such as DocBook." }, "GlossSee" : "markup", "GlossTerm" : "Standard Generalized Markup Language", "ID" : "SGML", "SortAs" : "SGML" } }, "title" : "S" }, "title" : "example glossary" } } sbjson-2.3.2/Tests/Data/json.org/1.json.terse000066400000000000000000000005511151270151400207000ustar00rootroot00000000000000{"glossary":{"GlossDiv":{"GlossList":{"GlossEntry":{"Abbrev":"ISO 8879:1986","Acronym":"SGML","GlossDef":{"GlossSeeAlso":["GML","XML"],"para":"A meta-markup language, used to create markup languages such as DocBook."},"GlossSee":"markup","GlossTerm":"Standard Generalized Markup Language","ID":"SGML","SortAs":"SGML"}},"title":"S"},"title":"example glossary"}} sbjson-2.3.2/Tests/Data/json.org/2.json000066400000000000000000000003621151270151400175600ustar00rootroot00000000000000{"menu": { "id": "file", "value": "File", "popup": { "menuitem": [ {"value": "New", "onclick": "CreateNewDoc()"}, {"value": "Open", "onclick": "OpenDoc()"}, {"value": "Close", "onclick": "CloseDoc()"} ] } }} sbjson-2.3.2/Tests/Data/json.org/2.json.pretty000066400000000000000000000005571151270151400211140ustar00rootroot00000000000000{ "menu" : { "id" : "file", "popup" : { "menuitem" : [ { "onclick" : "CreateNewDoc()", "value" : "New" }, { "onclick" : "OpenDoc()", "value" : "Open" }, { "onclick" : "CloseDoc()", "value" : "Close" } ] }, "value" : "File" } } sbjson-2.3.2/Tests/Data/json.org/2.json.terse000066400000000000000000000002701151270151400206770ustar00rootroot00000000000000{"menu":{"id":"file","popup":{"menuitem":[{"onclick":"CreateNewDoc()","value":"New"},{"onclick":"OpenDoc()","value":"Open"},{"onclick":"CloseDoc()","value":"Close"}]},"value":"File"}} sbjson-2.3.2/Tests/Data/json.org/3.json000066400000000000000000000011361151270151400175610ustar00rootroot00000000000000{"widget": { "debug": "on", "window": { "title": "Sample Konfabulator Widget", "name": "main_window", "width": 500, "height": 500 }, "image": { "src": "Images/Sun.png", "name": "sun1", "hOffset": 250, "vOffset": 250, "alignment": "center" }, "text": { "data": "Click Here", "size": 36, "style": "bold", "name": "text1", "hOffset": 250, "vOffset": 100, "alignment": "center", "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;" } }} sbjson-2.3.2/Tests/Data/json.org/3.json.pretty000066400000000000000000000011231151270151400211030ustar00rootroot00000000000000{ "widget" : { "debug" : "on", "image" : { "alignment" : "center", "hOffset" : 250, "name" : "sun1", "src" : "Images/Sun.png", "vOffset" : 250 }, "text" : { "alignment" : "center", "data" : "Click Here", "hOffset" : 250, "name" : "text1", "onMouseUp" : "sun1.opacity = (sun1.opacity / 100) * 90;", "size" : 36, "style" : "bold", "vOffset" : 100 }, "window" : { "height" : 500, "name" : "main_window", "title" : "Sample Konfabulator Widget", "width" : 500 } } } sbjson-2.3.2/Tests/Data/json.org/3.json.terse000066400000000000000000000006061151270151400207030ustar00rootroot00000000000000{"widget":{"debug":"on","image":{"alignment":"center","hOffset":250,"name":"sun1","src":"Images/Sun.png","vOffset":250},"text":{"alignment":"center","data":"Click Here","hOffset":250,"name":"text1","onMouseUp":"sun1.opacity = (sun1.opacity / 100) * 90;","size":36,"style":"bold","vOffset":100},"window":{"height":500,"name":"main_window","title":"Sample Konfabulator Widget","width":500}}} sbjson-2.3.2/Tests/Data/json.org/4.json000066400000000000000000000066131151270151400175670ustar00rootroot00000000000000{"web-app": { "servlet": [ { "servlet-name": "cofaxCDS", "servlet-class": "org.cofax.cds.CDSServlet", "init-param": { "configGlossary:installationAt": "Philadelphia, PA", "configGlossary:adminEmail": "ksm@pobox.com", "configGlossary:poweredBy": "Cofax", "configGlossary:poweredByIcon": "/images/cofax.gif", "configGlossary:staticPath": "/content/static", "templateProcessorClass": "org.cofax.WysiwygTemplate", "templateLoaderClass": "org.cofax.FilesTemplateLoader", "templatePath": "templates", "templateOverridePath": "", "defaultListTemplate": "listTemplate.htm", "defaultFileTemplate": "articleTemplate.htm", "useJSP": false, "jspListTemplate": "listTemplate.jsp", "jspFileTemplate": "articleTemplate.jsp", "cachePackageTagsTrack": 200, "cachePackageTagsStore": 200, "cachePackageTagsRefresh": 60, "cacheTemplatesTrack": 100, "cacheTemplatesStore": 50, "cacheTemplatesRefresh": 15, "cachePagesTrack": 200, "cachePagesStore": 100, "cachePagesRefresh": 10, "cachePagesDirtyRead": 10, "searchEngineListTemplate": "forSearchEnginesList.htm", "searchEngineFileTemplate": "forSearchEngines.htm", "searchEngineRobotsDb": "WEB-INF/robots.db", "useDataStore": true, "dataStoreClass": "org.cofax.SqlDataStore", "redirectionClass": "org.cofax.SqlRedirection", "dataStoreName": "cofax", "dataStoreDriver": "com.microsoft.jdbc.sqlserver.SQLServerDriver", "dataStoreUrl": "jdbc:microsoft:sqlserver://LOCALHOST:1433;DatabaseName=goon", "dataStoreUser": "sa", "dataStorePassword": "dataStoreTestQuery", "dataStoreTestQuery": "SET NOCOUNT ON;select test='test';", "dataStoreLogFile": "/usr/local/tomcat/logs/datastore.log", "dataStoreInitConns": 10, "dataStoreMaxConns": 100, "dataStoreConnUsageLimit": 100, "dataStoreLogLevel": "debug", "maxUrlLength": 500}}, { "servlet-name": "cofaxEmail", "servlet-class": "org.cofax.cds.EmailServlet", "init-param": { "mailHost": "mail1", "mailHostOverride": "mail2"}}, { "servlet-name": "cofaxAdmin", "servlet-class": "org.cofax.cds.AdminServlet"}, { "servlet-name": "fileServlet", "servlet-class": "org.cofax.cds.FileServlet"}, { "servlet-name": "cofaxTools", "servlet-class": "org.cofax.cms.CofaxToolsServlet", "init-param": { "templatePath": "toolstemplates/", "log": 1, "logLocation": "/usr/local/tomcat/logs/CofaxTools.log", "logMaxSize": "", "dataLog": 1, "dataLogLocation": "/usr/local/tomcat/logs/dataLog.log", "dataLogMaxSize": "", "removePageCache": "/content/admin/remove?cache=pages&id=", "removeTemplateCache": "/content/admin/remove?cache=templates&id=", "fileTransferFolder": "/usr/local/tomcat/webapps/content/fileTransferFolder", "lookInContext": 1, "adminGroupID": 4, "betaServer": true}}], "servlet-mapping": { "cofaxCDS": "/", "cofaxEmail": "/cofaxutil/aemail/*", "cofaxAdmin": "/admin/*", "fileServlet": "/static/*", "cofaxTools": "/tools/*"}, "taglib": { "taglib-uri": "cofax.tld", "taglib-location": "/WEB-INF/tlds/cofax.tld"}}}sbjson-2.3.2/Tests/Data/json.org/4.json.pretty000066400000000000000000000073301151270151400211120ustar00rootroot00000000000000{ "web-app" : { "servlet" : [ { "init-param" : { "cachePackageTagsRefresh" : 60, "cachePackageTagsStore" : 200, "cachePackageTagsTrack" : 200, "cachePagesDirtyRead" : 10, "cachePagesRefresh" : 10, "cachePagesStore" : 100, "cachePagesTrack" : 200, "cacheTemplatesRefresh" : 15, "cacheTemplatesStore" : 50, "cacheTemplatesTrack" : 100, "configGlossary:adminEmail" : "ksm@pobox.com", "configGlossary:installationAt" : "Philadelphia, PA", "configGlossary:poweredBy" : "Cofax", "configGlossary:poweredByIcon" : "/images/cofax.gif", "configGlossary:staticPath" : "/content/static", "dataStoreClass" : "org.cofax.SqlDataStore", "dataStoreConnUsageLimit" : 100, "dataStoreDriver" : "com.microsoft.jdbc.sqlserver.SQLServerDriver", "dataStoreInitConns" : 10, "dataStoreLogFile" : "/usr/local/tomcat/logs/datastore.log", "dataStoreLogLevel" : "debug", "dataStoreMaxConns" : 100, "dataStoreName" : "cofax", "dataStorePassword" : "dataStoreTestQuery", "dataStoreTestQuery" : "SET NOCOUNT ON;select test='test';", "dataStoreUrl" : "jdbc:microsoft:sqlserver://LOCALHOST:1433;DatabaseName=goon", "dataStoreUser" : "sa", "defaultFileTemplate" : "articleTemplate.htm", "defaultListTemplate" : "listTemplate.htm", "jspFileTemplate" : "articleTemplate.jsp", "jspListTemplate" : "listTemplate.jsp", "maxUrlLength" : 500, "redirectionClass" : "org.cofax.SqlRedirection", "searchEngineFileTemplate" : "forSearchEngines.htm", "searchEngineListTemplate" : "forSearchEnginesList.htm", "searchEngineRobotsDb" : "WEB-INF/robots.db", "templateLoaderClass" : "org.cofax.FilesTemplateLoader", "templateOverridePath" : "", "templatePath" : "templates", "templateProcessorClass" : "org.cofax.WysiwygTemplate", "useDataStore" : true, "useJSP" : false }, "servlet-class" : "org.cofax.cds.CDSServlet", "servlet-name" : "cofaxCDS" }, { "init-param" : { "mailHost" : "mail1", "mailHostOverride" : "mail2" }, "servlet-class" : "org.cofax.cds.EmailServlet", "servlet-name" : "cofaxEmail" }, { "servlet-class" : "org.cofax.cds.AdminServlet", "servlet-name" : "cofaxAdmin" }, { "servlet-class" : "org.cofax.cds.FileServlet", "servlet-name" : "fileServlet" }, { "init-param" : { "adminGroupID" : 4, "betaServer" : true, "dataLog" : 1, "dataLogLocation" : "/usr/local/tomcat/logs/dataLog.log", "dataLogMaxSize" : "", "fileTransferFolder" : "/usr/local/tomcat/webapps/content/fileTransferFolder", "log" : 1, "logLocation" : "/usr/local/tomcat/logs/CofaxTools.log", "logMaxSize" : "", "lookInContext" : 1, "removePageCache" : "/content/admin/remove?cache=pages&id=", "removeTemplateCache" : "/content/admin/remove?cache=templates&id=", "templatePath" : "toolstemplates/" }, "servlet-class" : "org.cofax.cms.CofaxToolsServlet", "servlet-name" : "cofaxTools" } ], "servlet-mapping" : { "cofaxAdmin" : "/admin/*", "cofaxCDS" : "/", "cofaxEmail" : "/cofaxutil/aemail/*", "cofaxTools" : "/tools/*", "fileServlet" : "/static/*" }, "taglib" : { "taglib-location" : "/WEB-INF/tlds/cofax.tld", "taglib-uri" : "cofax.tld" } } } sbjson-2.3.2/Tests/Data/json.org/4.json.terse000066400000000000000000000052271151270151400207100ustar00rootroot00000000000000{"web-app":{"servlet":[{"init-param":{"cachePackageTagsRefresh":60,"cachePackageTagsStore":200,"cachePackageTagsTrack":200,"cachePagesDirtyRead":10,"cachePagesRefresh":10,"cachePagesStore":100,"cachePagesTrack":200,"cacheTemplatesRefresh":15,"cacheTemplatesStore":50,"cacheTemplatesTrack":100,"configGlossary:adminEmail":"ksm@pobox.com","configGlossary:installationAt":"Philadelphia, PA","configGlossary:poweredBy":"Cofax","configGlossary:poweredByIcon":"/images/cofax.gif","configGlossary:staticPath":"/content/static","dataStoreClass":"org.cofax.SqlDataStore","dataStoreConnUsageLimit":100,"dataStoreDriver":"com.microsoft.jdbc.sqlserver.SQLServerDriver","dataStoreInitConns":10,"dataStoreLogFile":"/usr/local/tomcat/logs/datastore.log","dataStoreLogLevel":"debug","dataStoreMaxConns":100,"dataStoreName":"cofax","dataStorePassword":"dataStoreTestQuery","dataStoreTestQuery":"SET NOCOUNT ON;select test='test';","dataStoreUrl":"jdbc:microsoft:sqlserver://LOCALHOST:1433;DatabaseName=goon","dataStoreUser":"sa","defaultFileTemplate":"articleTemplate.htm","defaultListTemplate":"listTemplate.htm","jspFileTemplate":"articleTemplate.jsp","jspListTemplate":"listTemplate.jsp","maxUrlLength":500,"redirectionClass":"org.cofax.SqlRedirection","searchEngineFileTemplate":"forSearchEngines.htm","searchEngineListTemplate":"forSearchEnginesList.htm","searchEngineRobotsDb":"WEB-INF/robots.db","templateLoaderClass":"org.cofax.FilesTemplateLoader","templateOverridePath":"","templatePath":"templates","templateProcessorClass":"org.cofax.WysiwygTemplate","useDataStore":true,"useJSP":false},"servlet-class":"org.cofax.cds.CDSServlet","servlet-name":"cofaxCDS"},{"init-param":{"mailHost":"mail1","mailHostOverride":"mail2"},"servlet-class":"org.cofax.cds.EmailServlet","servlet-name":"cofaxEmail"},{"servlet-class":"org.cofax.cds.AdminServlet","servlet-name":"cofaxAdmin"},{"servlet-class":"org.cofax.cds.FileServlet","servlet-name":"fileServlet"},{"init-param":{"adminGroupID":4,"betaServer":true,"dataLog":1,"dataLogLocation":"/usr/local/tomcat/logs/dataLog.log","dataLogMaxSize":"","fileTransferFolder":"/usr/local/tomcat/webapps/content/fileTransferFolder","log":1,"logLocation":"/usr/local/tomcat/logs/CofaxTools.log","logMaxSize":"","lookInContext":1,"removePageCache":"/content/admin/remove?cache=pages&id=","removeTemplateCache":"/content/admin/remove?cache=templates&id=","templatePath":"toolstemplates/"},"servlet-class":"org.cofax.cms.CofaxToolsServlet","servlet-name":"cofaxTools"}],"servlet-mapping":{"cofaxAdmin":"/admin/*","cofaxCDS":"/","cofaxEmail":"/cofaxutil/aemail/*","cofaxTools":"/tools/*","fileServlet":"/static/*"},"taglib":{"taglib-location":"/WEB-INF/tlds/cofax.tld","taglib-uri":"cofax.tld"}}} sbjson-2.3.2/Tests/Data/json.org/5.json000066400000000000000000000015511151270151400175640ustar00rootroot00000000000000{"menu": { "header": "SVG Viewer", "items": [ {"id": "Open"}, {"id": "OpenNew", "label": "Open New"}, null, {"id": "ZoomIn", "label": "Zoom In"}, {"id": "ZoomOut", "label": "Zoom Out"}, {"id": "OriginalView", "label": "Original View"}, null, {"id": "Quality"}, {"id": "Pause"}, {"id": "Mute"}, null, {"id": "Find", "label": "Find..."}, {"id": "FindAgain", "label": "Find Again"}, {"id": "Copy"}, {"id": "CopyAgain", "label": "Copy Again"}, {"id": "CopySVG", "label": "Copy SVG"}, {"id": "ViewSVG", "label": "View SVG"}, {"id": "ViewSource", "label": "View Source"}, {"id": "SaveAs", "label": "Save As"}, null, {"id": "Help"}, {"id": "About", "label": "About Adobe CVG Viewer..."} ] }} sbjson-2.3.2/Tests/Data/json.org/5.json.pretty000066400000000000000000000023441151270151400211130ustar00rootroot00000000000000{ "menu" : { "header" : "SVG Viewer", "items" : [ { "id" : "Open" }, { "id" : "OpenNew", "label" : "Open New" }, null, { "id" : "ZoomIn", "label" : "Zoom In" }, { "id" : "ZoomOut", "label" : "Zoom Out" }, { "id" : "OriginalView", "label" : "Original View" }, null, { "id" : "Quality" }, { "id" : "Pause" }, { "id" : "Mute" }, null, { "id" : "Find", "label" : "Find..." }, { "id" : "FindAgain", "label" : "Find Again" }, { "id" : "Copy" }, { "id" : "CopyAgain", "label" : "Copy Again" }, { "id" : "CopySVG", "label" : "Copy SVG" }, { "id" : "ViewSVG", "label" : "View SVG" }, { "id" : "ViewSource", "label" : "View Source" }, { "id" : "SaveAs", "label" : "Save As" }, null, { "id" : "Help" }, { "id" : "About", "label" : "About Adobe CVG Viewer..." } ] } } sbjson-2.3.2/Tests/Data/json.org/5.json.terse000066400000000000000000000011461151270151400207050ustar00rootroot00000000000000{"menu":{"header":"SVG Viewer","items":[{"id":"Open"},{"id":"OpenNew","label":"Open New"},null,{"id":"ZoomIn","label":"Zoom In"},{"id":"ZoomOut","label":"Zoom Out"},{"id":"OriginalView","label":"Original View"},null,{"id":"Quality"},{"id":"Pause"},{"id":"Mute"},null,{"id":"Find","label":"Find..."},{"id":"FindAgain","label":"Find Again"},{"id":"Copy"},{"id":"CopyAgain","label":"Copy Again"},{"id":"CopySVG","label":"Copy SVG"},{"id":"ViewSVG","label":"View SVG"},{"id":"ViewSource","label":"View Source"},{"id":"SaveAs","label":"Save As"},null,{"id":"Help"},{"id":"About","label":"About Adobe CVG Viewer..."}]}} sbjson-2.3.2/Tests/Data/json.org/README000066400000000000000000000000441151270151400174010ustar00rootroot00000000000000Source: http://json.org/example.htmlsbjson-2.3.2/Tests/Data/jsonchecker/000077500000000000000000000000001151270151400172625ustar00rootroot00000000000000sbjson-2.3.2/Tests/Data/jsonchecker/README000066400000000000000000000000451151270151400201410ustar00rootroot00000000000000Source: http://json.org/JSON_checker/sbjson-2.3.2/Tests/Data/jsonchecker/fail1.json000066400000000000000000000000741151270151400211520ustar00rootroot00000000000000"A JSON payload should be an object or array, not a string."sbjson-2.3.2/Tests/Data/jsonchecker/fail10.json000066400000000000000000000000721151270151400212300ustar00rootroot00000000000000{"Extra value after close": true} "misplaced quoted value"sbjson-2.3.2/Tests/Data/jsonchecker/fail11.json000066400000000000000000000000351151270151400212300ustar00rootroot00000000000000{"Illegal expression": 1 + 2}sbjson-2.3.2/Tests/Data/jsonchecker/fail12.json000066400000000000000000000000371151270151400212330ustar00rootroot00000000000000{"Illegal invocation": alert()}sbjson-2.3.2/Tests/Data/jsonchecker/fail13.json000066400000000000000000000000531151270151400212320ustar00rootroot00000000000000{"Numbers cannot have leading zeroes": 013}sbjson-2.3.2/Tests/Data/jsonchecker/fail14.json000066400000000000000000000000371151270151400212350ustar00rootroot00000000000000{"Numbers cannot be hex": 0x14}sbjson-2.3.2/Tests/Data/jsonchecker/fail15.json000066400000000000000000000000421151270151400212320ustar00rootroot00000000000000["Illegal backslash escape: \x15"]sbjson-2.3.2/Tests/Data/jsonchecker/fail16.json000066400000000000000000000000101151270151400212260ustar00rootroot00000000000000[\naked]sbjson-2.3.2/Tests/Data/jsonchecker/fail17.json000066400000000000000000000000421151270151400212340ustar00rootroot00000000000000["Illegal backslash escape: \017"]sbjson-2.3.2/Tests/Data/jsonchecker/fail18.json000066400000000000000000000000621151270151400212370ustar00rootroot00000000000000[[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]]sbjson-2.3.2/Tests/Data/jsonchecker/fail19.json000066400000000000000000000000261151270151400212400ustar00rootroot00000000000000{"Missing colon" null}sbjson-2.3.2/Tests/Data/jsonchecker/fail2.json000066400000000000000000000000211151270151400211430ustar00rootroot00000000000000["Unclosed array"sbjson-2.3.2/Tests/Data/jsonchecker/fail20.json000066400000000000000000000000271151270151400212310ustar00rootroot00000000000000{"Double colon":: null}sbjson-2.3.2/Tests/Data/jsonchecker/fail21.json000066400000000000000000000000401151270151400212250ustar00rootroot00000000000000{"Comma instead of colon", null}sbjson-2.3.2/Tests/Data/jsonchecker/fail22.json000066400000000000000000000000411151270151400212270ustar00rootroot00000000000000["Colon instead of comma": false]sbjson-2.3.2/Tests/Data/jsonchecker/fail23.json000066400000000000000000000000241151270151400212310ustar00rootroot00000000000000["Bad value", truth]sbjson-2.3.2/Tests/Data/jsonchecker/fail24.json000066400000000000000000000000201151270151400212260ustar00rootroot00000000000000['single quote']sbjson-2.3.2/Tests/Data/jsonchecker/fail25.json000066400000000000000000000000351151270151400212350ustar00rootroot00000000000000[" tab character in string "]sbjson-2.3.2/Tests/Data/jsonchecker/fail26.json000066400000000000000000000000461151270151400212400ustar00rootroot00000000000000["tab\ character\ in\ string\ "]sbjson-2.3.2/Tests/Data/jsonchecker/fail27.json000066400000000000000000000000161151270151400212360ustar00rootroot00000000000000["line break"]sbjson-2.3.2/Tests/Data/jsonchecker/fail28.json000066400000000000000000000000171151270151400212400ustar00rootroot00000000000000["line\ break"]sbjson-2.3.2/Tests/Data/jsonchecker/fail29.json000066400000000000000000000000041151270151400212350ustar00rootroot00000000000000[0e]sbjson-2.3.2/Tests/Data/jsonchecker/fail3.json000066400000000000000000000000451151270151400211520ustar00rootroot00000000000000{unquoted_key: "keys must be quoted"}sbjson-2.3.2/Tests/Data/jsonchecker/fail30.json000066400000000000000000000000051151270151400212260ustar00rootroot00000000000000[0e+]sbjson-2.3.2/Tests/Data/jsonchecker/fail31.json000066400000000000000000000000071151270151400212310ustar00rootroot00000000000000[0e+-1]sbjson-2.3.2/Tests/Data/jsonchecker/fail32.json000066400000000000000000000000501151270151400212300ustar00rootroot00000000000000{"Comma instead if closing brace": true,sbjson-2.3.2/Tests/Data/jsonchecker/fail33.json000066400000000000000000000000141151270151400212310ustar00rootroot00000000000000["mismatch"}sbjson-2.3.2/Tests/Data/jsonchecker/fail4.json000066400000000000000000000000201151270151400211440ustar00rootroot00000000000000["extra comma",]sbjson-2.3.2/Tests/Data/jsonchecker/fail5.json000066400000000000000000000000301151270151400211460ustar00rootroot00000000000000["double extra comma",,]sbjson-2.3.2/Tests/Data/jsonchecker/fail6.json000066400000000000000000000000321151270151400211510ustar00rootroot00000000000000[ , "<-- missing value"]sbjson-2.3.2/Tests/Data/jsonchecker/fail7.json000066400000000000000000000000321151270151400211520ustar00rootroot00000000000000["Comma after the close"],sbjson-2.3.2/Tests/Data/jsonchecker/fail8.json000066400000000000000000000000201151270151400211500ustar00rootroot00000000000000["Extra close"]]sbjson-2.3.2/Tests/Data/jsonchecker/fail9.json000066400000000000000000000000261151270151400211570ustar00rootroot00000000000000{"Extra comma": true,}sbjson-2.3.2/Tests/Data/jsonchecker/pass1.json000066400000000000000000000026411151270151400212070ustar00rootroot00000000000000[ "JSON Test Pattern pass1", {"object with 1 member":["array with 1 element"]}, {}, [], -42, true, false, null, { "integer": 1234567890, "real": -9876.543210, "e": 0.123456789e-12, "E": 1.234567890E+34, "": 23456789012E66, "zero": 0, "one": 1, "space": " ", "quote": "\"", "backslash": "\\", "controls": "\b\f\n\r\t", "slash": "/ & \/", "alpha": "abcdefghijklmnopqrstuvwyz", "ALPHA": "ABCDEFGHIJKLMNOPQRSTUVWYZ", "digit": "0123456789", "0123456789": "digit", "special": "`1~!@#$%^&*()_+-={':[,]}|;.?", "hex": "\u0123\u4567\u89AB\uCDEF\uabcd\uef4A", "true": true, "false": false, "null": null, "array":[ ], "object":{ }, "address": "50 St. James Street", "url": "http://www.JSON.org/", "comment": "// /* */": " ", " s p a c e d " :[1,2 , 3 , 4 , 5 , 6 ,7 ],"compact":[1,2,3,4,5,6,7], "jsontext": "{\"object with 1 member\":[\"array with 1 element\"]}", "quotes": "" \u0022 %22 0x22 034 "", "\/\\\"\uCAFE\uBABE\uAB98\uFCDE\ubcda\uef4A\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?" : "A key can be any string" }, 0.5 ,98.6 , 99.44 , 1066, 1e1, 0.1e1, 1e-1, 1e00,2e+00,2e-00 ,"rosebud"]sbjson-2.3.2/Tests/Data/jsonchecker/pass1.json.pretty000066400000000000000000000026711151270151400225400ustar00rootroot00000000000000[ "JSON Test Pattern pass1", { "object with 1 member" : [ "array with 1 element" ] }, {}, [], -42, true, false, null, { "" : 23456789012000000000000000000000000000000000000000000000000000000000000000000, " s p a c e d " : [ 1, 2, 3, 4, 5, 6, 7 ], "# -- --> */" : " ", "/\\\"쫾몾ꮘﳞ볚\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?" : "A key can be any string", "0123456789" : "digit", "ALPHA" : "ABCDEFGHIJKLMNOPQRSTUVWYZ", "E" : 12345678900000000000000000000000000, "address" : "50 St. James Street", "alpha" : "abcdefghijklmnopqrstuvwyz", "array" : [], "backslash" : "\\", "comment" : "// /* */":" ","/\\\"쫾몾ꮘﳞ볚\b\f\n\r\t`1~!@#$%^&*()_+-=[]{}|;:',./<>?":"A key can be any string","0123456789":"digit","ALPHA":"ABCDEFGHIJKLMNOPQRSTUVWYZ","E":12345678900000000000000000000000000,"address":"50 St. James Street","alpha":"abcdefghijklmnopqrstuvwyz","array":[],"backslash":"\\","comment":"// /*