Skip to content

Commit

Permalink
Fixed a problem generaitng JSON with NaN value
Browse files Browse the repository at this point in the history
There was a problem where the JSON generator would allow NaN value of
NSDecimalNumber to be written into JSON. This was due to the fact that
NSDecimalNumber is a subclass of NSNumber, and stringValue of NaN value
is represented as "NaN", which is invalid in JSON. JSON data with NaN
value can cause many parsers to fail (including YAJL), as this is not
supported by JSON.
  • Loading branch information
aki-null committed Aug 1, 2013
1 parent 51f2457 commit e83697a
Show file tree
Hide file tree
Showing 5 changed files with 15 additions and 8 deletions.
12 changes: 8 additions & 4 deletions Classes/YAJLGen.m
Original file line number Diff line number Diff line change
Expand Up @@ -118,10 +118,14 @@ - (void)bool:(BOOL)b {
}

- (void)number:(NSNumber *)number {
NSString *s = [number stringValue];
unsigned int length = [s lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
const char *c = [s UTF8String];
yajl_gen_number(gen_, c, length);
if ([number isEqualToNumber:[NSDecimalNumber notANumber]]) {
yajl_gen_null(gen_);
} else {
NSString *s = [number stringValue];
unsigned int length = [s lengthOfBytesUsingEncoding:NSUTF8StringEncoding];
const char *c = [s UTF8String];
yajl_gen_number(gen_, c, length);
}
}

- (void)string:(NSString *)s {
Expand Down
2 changes: 1 addition & 1 deletion Tests/NSObjectTest.m
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ @implementation NSObjectTest
- (void)testDictionary {
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
[NSArray arrayWithObjects:@"arrayValue1", [NSNumber numberWithBool:YES], [NSNumber numberWithBool:NO], [NSNull null],
[NSNumber numberWithInteger:1], [NSNumber numberWithDouble:234234.234234], nil], @"key2",
[NSNumber numberWithInteger:1], [NSNumber numberWithDouble:234234.234234], [NSDecimalNumber notANumber], nil], @"key2",
nil];

NSString *JSONString = [dict yajl_JSONStringWithOptions:YAJLGenOptionsBeautify indentString:@" "];
Expand Down
3 changes: 2 additions & 1 deletion Tests/Samples/gen_expected1.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
false,
null,
1,
234234.234234
234234.234234,
null
]
}
2 changes: 1 addition & 1 deletion Tests/Samples/gen_expected2.json
Original file line number Diff line number Diff line change
@@ -1 +1 @@
{"key2":["arrayValue1",true,false,null,1,234234.234234]}
{"key2":["arrayValue1",true,false,null,1,234234.234234,null]}
4 changes: 3 additions & 1 deletion Tests/YAJLGenTest.m
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ - (void)testGen1 {
[gen null];
[gen number:[NSNumber numberWithInteger:1]];
[gen number:[NSNumber numberWithDouble:234234.234234]];
[gen number:[NSDecimalNumber notANumber]];
[gen endArray];
[gen endDictionary];
NSString *buffer = [gen buffer];
Expand All @@ -48,6 +49,7 @@ - (void)testGen2 {
[gen null];
[gen number:[NSNumber numberWithInteger:1]];
[gen number:[NSNumber numberWithDouble:234234.234234]];
[gen number:[NSDecimalNumber notANumber]];
[gen endArray];
[gen endDictionary];
NSString *buffer = [gen buffer];
Expand All @@ -63,7 +65,7 @@ - (void)testGen2 {
- (void)testGenObject1 {
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
[NSArray arrayWithObjects:@"arrayValue1", [NSNumber numberWithBool:YES], [NSNumber numberWithBool:NO], [NSNull null],
[NSNumber numberWithInteger:1], [NSNumber numberWithDouble:234234.234234], nil], @"key2",
[NSNumber numberWithInteger:1], [NSNumber numberWithDouble:234234.234234], [NSDecimalNumber notANumber], nil], @"key2",
nil];

YAJLGen *gen = [[YAJLGen alloc] initWithGenOptions:YAJLGenOptionsBeautify indentString:@" "];
Expand Down

0 comments on commit e83697a

Please sign in to comment.