pax_global_header 0000666 0000000 0000000 00000000064 11512701514 0014507 g ustar 00root root 0000000 0000000 52 comment=f56d63f961ea8c2c8471ba8f088f36a869c398f7
sbjson-2.3.2/ 0000775 0000000 0000000 00000000000 11512701514 0013011 5 ustar 00root root 0000000 0000000 sbjson-2.3.2/.gitignore 0000664 0000000 0000000 00000000032 11512701514 0014774 0 ustar 00root root 0000000 0000000 *.mode1v3
*.pbxuser
build
sbjson-2.3.2/Changes.markdown 0000664 0000000 0000000 00000016731 11512701514 0016135 0 ustar 00root root 0000000 0000000 # 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/ 0000775 0000000 0000000 00000000000 11512701514 0014406 5 ustar 00root root 0000000 0000000 sbjson-2.3.2/Classes/JSON.h 0000664 0000000 0000000 00000005305 11512701514 0015333 0 ustar 00root root 0000000 0000000 /*
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.h 0000664 0000000 0000000 00000004137 11512701514 0017225 0 ustar 00root root 0000000 0000000 /*
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.m 0000664 0000000 0000000 00000003575 11512701514 0017237 0 ustar 00root root 0000000 0000000 /*
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.h 0000664 0000000 0000000 00000003760 11512701514 0017266 0 ustar 00root root 0000000 0000000 /*
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.m 0000664 0000000 0000000 00000003535 11512701514 0017273 0 ustar 00root root 0000000 0000000 /*
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.h 0000664 0000000 0000000 00000005602 11512701514 0016513 0 ustar 00root root 0000000 0000000 /*
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.m 0000664 0000000 0000000 00000005301 11512701514 0016514 0 ustar 00root root 0000000 0000000 /*
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.h 0000664 0000000 0000000 00000006217 11512701514 0017100 0 ustar 00root root 0000000 0000000 /*
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.m 0000664 0000000 0000000 00000035572 11512701514 0017113 0 ustar 00root root 0000000 0000000 /*
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.h 0000664 0000000 0000000 00000010731 11512701514 0017114 0 ustar 00root root 0000000 0000000 /*
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.m 0000664 0000000 0000000 00000020155 11512701514 0017122 0 ustar 00root root 0000000 0000000 /*
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.markdown 0000664 0000000 0000000 00000003220 11512701514 0016147 0 ustar 00root root 0000000 0000000 # 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.markdown 0000664 0000000 0000000 00000002613 11512701514 0017220 0 ustar 00root root 0000000 0000000 Super-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.plist 0000664 0000000 0000000 00000001243 11512701514 0015530 0 ustar 00root root 0000000 0000000
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/ 0000775 0000000 0000000 00000000000 11512701514 0015556 5 ustar 00root root 0000000 0000000 sbjson-2.3.2/JSON.xcodeproj/project.pbxproj 0000664 0000000 0000000 00000275027 11512701514 0020647 0 ustar 00root root 0000000 0000000 // !$*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/LICENSE 0000664 0000000 0000000 00000002714 11512701514 0014022 0 ustar 00root root 0000000 0000000 Copyright (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/ 0000775 0000000 0000000 00000000000 11512701514 0014101 5 ustar 00root root 0000000 0000000 sbjson-2.3.2/Notes/JensAlfkePerformanceNotes.txt 0000664 0000000 0000000 00000007756 11512701514 0021716 0 ustar 00root root 0000000 0000000 A 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.txt 0000664 0000000 0000000 00000003370 11512701514 0020071 0 ustar 00root root 0000000 0000000 In 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.markdown 0000664 0000000 0000000 00000001444 11512701514 0015755 0 ustar 00root root 0000000 0000000 JSON 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.markdown 0000664 0000000 0000000 00000000220 11512701514 0017761 0 ustar 00root root 0000000 0000000 * Update Changes.markdown
* agvtool new-marketing-version XXX
* agvtool bump
* update website
* Refresh API documentation
* close fixed tickets
sbjson-2.3.2/Scripts/ 0000775 0000000 0000000 00000000000 11512701514 0014440 5 ustar 00root root 0000000 0000000 sbjson-2.3.2/Scripts/InstallDocumentation.sh 0000775 0000000 0000000 00000003534 11512701514 0021144 0 ustar 00root root 0000000 0000000 #!/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.sh 0000775 0000000 0000000 00000001413 11512701514 0020352 0 ustar 00root root 0000000 0000000 #!/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.plist 0000664 0000000 0000000 00000001156 11512701514 0016064 0 ustar 00root root 0000000 0000000
CFBundleDevelopmentRegion
English
CFBundleExecutable
${EXECUTABLE_NAME}
CFBundleIdentifier
com.yourcompany.Tests
CFBundleInfoDictionaryVersion
6.0
CFBundlePackageType
BNDL
CFBundleSignature
????
CFBundleVersion
1.0
sbjson-2.3.2/Tests/ 0000775 0000000 0000000 00000000000 11512701514 0014113 5 ustar 00root root 0000000 0000000 sbjson-2.3.2/Tests/AbstractTest.h 0000664 0000000 0000000 00000003242 11512701514 0016670 0 ustar 00root root 0000000 0000000 /*
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.m 0000664 0000000 0000000 00000003326 11512701514 0016700 0 ustar 00root root 0000000 0000000 /*
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/ 0000775 0000000 0000000 00000000000 11512701514 0014764 5 ustar 00root root 0000000 0000000 sbjson-2.3.2/Tests/Data/array.json 0000664 0000000 0000000 00000000072 11512701514 0016774 0 ustar 00root root 0000000 0000000 [
[],
["foo"],
["foo",["bar"]],
["foo",["bar",["quux"]]]
] sbjson-2.3.2/Tests/Data/array.json.pretty 0000664 0000000 0000000 00000000224 11512701514 0020321 0 ustar 00root root 0000000 0000000 [
[],
[
"foo"
],
[
"foo",
[
"bar"
]
],
[
"foo",
[
"bar",
[
"quux"
]
]
]
]
sbjson-2.3.2/Tests/Data/array.json.terse 0000664 0000000 0000000 00000000066 11512701514 0020120 0 ustar 00root root 0000000 0000000 [[],["foo"],["foo",["bar"]],["foo",["bar",["quux"]]]]
sbjson-2.3.2/Tests/Data/bool.json 0000664 0000000 0000000 00000000014 11512701514 0016605 0 ustar 00root root 0000000 0000000 [true,false] sbjson-2.3.2/Tests/Data/bool.json.pretty 0000664 0000000 0000000 00000000024 11512701514 0020134 0 ustar 00root root 0000000 0000000 [
true,
false
]
sbjson-2.3.2/Tests/Data/bool.json.terse 0000664 0000000 0000000 00000000015 11512701514 0017727 0 ustar 00root root 0000000 0000000 [true,false]
sbjson-2.3.2/Tests/Data/format.json 0000664 0000000 0000000 00000000067 11512701514 0017152 0 ustar 00root root 0000000 0000000 ["one",2,{"foo":null,"quux":true,"bar":[1, 2, []]},{}]
sbjson-2.3.2/Tests/Data/format.json.pretty 0000664 0000000 0000000 00000000164 11512701514 0020476 0 ustar 00root root 0000000 0000000 [
"one",
2,
{
"bar" : [
1,
2,
[]
],
"foo" : null,
"quux" : true
},
{}
]
sbjson-2.3.2/Tests/Data/format.json.terse 0000664 0000000 0000000 00000000065 11512701514 0020271 0 ustar 00root root 0000000 0000000 ["one",2,{"bar":[1,2,[]],"foo":null,"quux":true},{}]
sbjson-2.3.2/Tests/Data/json.org/ 0000775 0000000 0000000 00000000000 11512701514 0016523 5 ustar 00root root 0000000 0000000 sbjson-2.3.2/Tests/Data/json.org/1.json 0000664 0000000 0000000 00000001302 11512701514 0017552 0 ustar 00root root 0000000 0000000 {
"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.pretty 0000664 0000000 0000000 00000001141 11512701514 0021101 0 ustar 00root root 0000000 0000000 {
"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.terse 0000664 0000000 0000000 00000000551 11512701514 0020700 0 ustar 00root root 0000000 0000000 {"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.json 0000664 0000000 0000000 00000000362 11512701514 0017560 0 ustar 00root root 0000000 0000000 {"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.pretty 0000664 0000000 0000000 00000000557 11512701514 0021114 0 ustar 00root root 0000000 0000000 {
"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.terse 0000664 0000000 0000000 00000000270 11512701514 0020677 0 ustar 00root root 0000000 0000000 {"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.json 0000664 0000000 0000000 00000001136 11512701514 0017561 0 ustar 00root root 0000000 0000000 {"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.pretty 0000664 0000000 0000000 00000001123 11512701514 0021103 0 ustar 00root root 0000000 0000000 {
"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.terse 0000664 0000000 0000000 00000000606 11512701514 0020703 0 ustar 00root root 0000000 0000000 {"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.json 0000664 0000000 0000000 00000006613 11512701514 0017567 0 ustar 00root root 0000000 0000000 {"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.pretty 0000664 0000000 0000000 00000007330 11512701514 0021112 0 ustar 00root root 0000000 0000000 {
"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.terse 0000664 0000000 0000000 00000005227 11512701514 0020710 0 ustar 00root root 0000000 0000000 {"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.json 0000664 0000000 0000000 00000001551 11512701514 0017564 0 ustar 00root root 0000000 0000000 {"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.pretty 0000664 0000000 0000000 00000002344 11512701514 0021113 0 ustar 00root root 0000000 0000000 {
"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.terse 0000664 0000000 0000000 00000001146 11512701514 0020705 0 ustar 00root root 0000000 0000000 {"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/README 0000664 0000000 0000000 00000000044 11512701514 0017401 0 ustar 00root root 0000000 0000000 Source: http://json.org/example.html sbjson-2.3.2/Tests/Data/jsonchecker/ 0000775 0000000 0000000 00000000000 11512701514 0017262 5 ustar 00root root 0000000 0000000 sbjson-2.3.2/Tests/Data/jsonchecker/README 0000664 0000000 0000000 00000000045 11512701514 0020141 0 ustar 00root root 0000000 0000000 Source: http://json.org/JSON_checker/ sbjson-2.3.2/Tests/Data/jsonchecker/fail1.json 0000664 0000000 0000000 00000000074 11512701514 0021152 0 ustar 00root root 0000000 0000000 "A JSON payload should be an object or array, not a string." sbjson-2.3.2/Tests/Data/jsonchecker/fail10.json 0000664 0000000 0000000 00000000072 11512701514 0021230 0 ustar 00root root 0000000 0000000 {"Extra value after close": true} "misplaced quoted value" sbjson-2.3.2/Tests/Data/jsonchecker/fail11.json 0000664 0000000 0000000 00000000035 11512701514 0021230 0 ustar 00root root 0000000 0000000 {"Illegal expression": 1 + 2} sbjson-2.3.2/Tests/Data/jsonchecker/fail12.json 0000664 0000000 0000000 00000000037 11512701514 0021233 0 ustar 00root root 0000000 0000000 {"Illegal invocation": alert()} sbjson-2.3.2/Tests/Data/jsonchecker/fail13.json 0000664 0000000 0000000 00000000053 11512701514 0021232 0 ustar 00root root 0000000 0000000 {"Numbers cannot have leading zeroes": 013} sbjson-2.3.2/Tests/Data/jsonchecker/fail14.json 0000664 0000000 0000000 00000000037 11512701514 0021235 0 ustar 00root root 0000000 0000000 {"Numbers cannot be hex": 0x14} sbjson-2.3.2/Tests/Data/jsonchecker/fail15.json 0000664 0000000 0000000 00000000042 11512701514 0021232 0 ustar 00root root 0000000 0000000 ["Illegal backslash escape: \x15"] sbjson-2.3.2/Tests/Data/jsonchecker/fail16.json 0000664 0000000 0000000 00000000010 11512701514 0021226 0 ustar 00root root 0000000 0000000 [\naked] sbjson-2.3.2/Tests/Data/jsonchecker/fail17.json 0000664 0000000 0000000 00000000042 11512701514 0021234 0 ustar 00root root 0000000 0000000 ["Illegal backslash escape: \017"] sbjson-2.3.2/Tests/Data/jsonchecker/fail18.json 0000664 0000000 0000000 00000000062 11512701514 0021237 0 ustar 00root root 0000000 0000000 [[[[[[[[[[[[[[[[[[[["Too deep"]]]]]]]]]]]]]]]]]]]] sbjson-2.3.2/Tests/Data/jsonchecker/fail19.json 0000664 0000000 0000000 00000000026 11512701514 0021240 0 ustar 00root root 0000000 0000000 {"Missing colon" null} sbjson-2.3.2/Tests/Data/jsonchecker/fail2.json 0000664 0000000 0000000 00000000021 11512701514 0021143 0 ustar 00root root 0000000 0000000 ["Unclosed array" sbjson-2.3.2/Tests/Data/jsonchecker/fail20.json 0000664 0000000 0000000 00000000027 11512701514 0021231 0 ustar 00root root 0000000 0000000 {"Double colon":: null} sbjson-2.3.2/Tests/Data/jsonchecker/fail21.json 0000664 0000000 0000000 00000000040 11512701514 0021225 0 ustar 00root root 0000000 0000000 {"Comma instead of colon", null} sbjson-2.3.2/Tests/Data/jsonchecker/fail22.json 0000664 0000000 0000000 00000000041 11512701514 0021227 0 ustar 00root root 0000000 0000000 ["Colon instead of comma": false] sbjson-2.3.2/Tests/Data/jsonchecker/fail23.json 0000664 0000000 0000000 00000000024 11512701514 0021231 0 ustar 00root root 0000000 0000000 ["Bad value", truth] sbjson-2.3.2/Tests/Data/jsonchecker/fail24.json 0000664 0000000 0000000 00000000020 11512701514 0021226 0 ustar 00root root 0000000 0000000 ['single quote'] sbjson-2.3.2/Tests/Data/jsonchecker/fail25.json 0000664 0000000 0000000 00000000035 11512701514 0021235 0 ustar 00root root 0000000 0000000 [" tab character in string "] sbjson-2.3.2/Tests/Data/jsonchecker/fail26.json 0000664 0000000 0000000 00000000046 11512701514 0021240 0 ustar 00root root 0000000 0000000 ["tab\ character\ in\ string\ "] sbjson-2.3.2/Tests/Data/jsonchecker/fail27.json 0000664 0000000 0000000 00000000016 11512701514 0021236 0 ustar 00root root 0000000 0000000 ["line
break"] sbjson-2.3.2/Tests/Data/jsonchecker/fail28.json 0000664 0000000 0000000 00000000017 11512701514 0021240 0 ustar 00root root 0000000 0000000 ["line\
break"] sbjson-2.3.2/Tests/Data/jsonchecker/fail29.json 0000664 0000000 0000000 00000000004 11512701514 0021235 0 ustar 00root root 0000000 0000000 [0e] sbjson-2.3.2/Tests/Data/jsonchecker/fail3.json 0000664 0000000 0000000 00000000045 11512701514 0021152 0 ustar 00root root 0000000 0000000 {unquoted_key: "keys must be quoted"} sbjson-2.3.2/Tests/Data/jsonchecker/fail30.json 0000664 0000000 0000000 00000000005 11512701514 0021226 0 ustar 00root root 0000000 0000000 [0e+] sbjson-2.3.2/Tests/Data/jsonchecker/fail31.json 0000664 0000000 0000000 00000000007 11512701514 0021231 0 ustar 00root root 0000000 0000000 [0e+-1] sbjson-2.3.2/Tests/Data/jsonchecker/fail32.json 0000664 0000000 0000000 00000000050 11512701514 0021230 0 ustar 00root root 0000000 0000000 {"Comma instead if closing brace": true, sbjson-2.3.2/Tests/Data/jsonchecker/fail33.json 0000664 0000000 0000000 00000000014 11512701514 0021231 0 ustar 00root root 0000000 0000000 ["mismatch"} sbjson-2.3.2/Tests/Data/jsonchecker/fail4.json 0000664 0000000 0000000 00000000020 11512701514 0021144 0 ustar 00root root 0000000 0000000 ["extra comma",] sbjson-2.3.2/Tests/Data/jsonchecker/fail5.json 0000664 0000000 0000000 00000000030 11512701514 0021146 0 ustar 00root root 0000000 0000000 ["double extra comma",,] sbjson-2.3.2/Tests/Data/jsonchecker/fail6.json 0000664 0000000 0000000 00000000032 11512701514 0021151 0 ustar 00root root 0000000 0000000 [ , "<-- missing value"] sbjson-2.3.2/Tests/Data/jsonchecker/fail7.json 0000664 0000000 0000000 00000000032 11512701514 0021152 0 ustar 00root root 0000000 0000000 ["Comma after the close"], sbjson-2.3.2/Tests/Data/jsonchecker/fail8.json 0000664 0000000 0000000 00000000020 11512701514 0021150 0 ustar 00root root 0000000 0000000 ["Extra close"]] sbjson-2.3.2/Tests/Data/jsonchecker/fail9.json 0000664 0000000 0000000 00000000026 11512701514 0021157 0 ustar 00root root 0000000 0000000 {"Extra comma": true,} sbjson-2.3.2/Tests/Data/jsonchecker/pass1.json 0000664 0000000 0000000 00000002641 11512701514 0021207 0 ustar 00root root 0000000 0000000 [
"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.pretty 0000664 0000000 0000000 00000002671 11512701514 0022540 0 ustar 00root root 0000000 0000000 [
"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":"// /*