From ae9a3339fb237e91b74b32e306e888864538d41d Mon Sep 17 00:00:00 2001 From: rfm Date: Tue, 31 Jan 2012 16:32:40 +0000 Subject: [PATCH] JSON fixups thanks to Lubomir Rintel git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/base/trunk@34681 72102866-910b-0410-8b05-ffd578937521 --- ChangeLog | 6 ++ Source/NSJSONSerialization.m | 4 ++ Tests/base/NSJSONSerialization/json.m | 96 ++++++++++++++++----------- 3 files changed, 68 insertions(+), 38 deletions(-) diff --git a/ChangeLog b/ChangeLog index cb2db83cd..0228134bf 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2012-01-31 Richard Frith-Macdonald + + * Source/NSJSONSerialization.m: bugfix for empty strings. + * Tests/base/NSJSONSerialization/json.m: add a few emtpy element + tests and fixup to be more readable + 2012-01-31 Richard Frith-Macdonald * Version: revert last change as Fred pointed out I got it wrong and diff --git a/Source/NSJSONSerialization.m b/Source/NSJSONSerialization.m index 4f24a771a..a40e3b29d 100644 --- a/Source/NSJSONSerialization.m +++ b/Source/NSJSONSerialization.m @@ -374,6 +374,10 @@ parseString(ParserState *state) [str release]; } } + else if (nil == val) + { + val = [NSMutableString new]; + } if (!state->mutableStrings) { val = [val makeImmutableCopyOnFail: YES]; diff --git a/Tests/base/NSJSONSerialization/json.m b/Tests/base/NSJSONSerialization/json.m index cca1ed10c..275eeca1f 100644 --- a/Tests/base/NSJSONSerialization/json.m +++ b/Tests/base/NSJSONSerialization/json.m @@ -1,47 +1,67 @@ #import #import "ObjectTesting.h" - int main(void) { - [NSAutoreleasePool new]; - // Simple test JSON, used for all of the examples - NSString *json = @"\ - {\ - \"Image\": {\ - \"Width\": 800,\ - \"Height\": 600,\ - \"Title\": \"View from 15th Floor\",\ - \"Thumbnail\": {\ - \"Url\": \"http://www.example.com/image/481989943\",\ - \"Height\": 125,\ - \"Width\": \"100\"\ - },\ - },\ - \"IDs\": [116, 943, 234, 38793],\ - \"escapeTest\": \"\\\"\\u0001\"\ - }"; - NSStringEncoding encs[] = {NSUTF8StringEncoding, NSUTF16LittleEndianStringEncoding, NSUTF16BigEndianStringEncoding, NSUTF32LittleEndianStringEncoding, NSUTF32BigEndianStringEncoding}; - id obj; - int i; + [NSAutoreleasePool new]; + // Simple test JSON, used for all of the examples - for (i=0 ; i<(sizeof(encs) / sizeof(NSStringEncoding)) ; i++) + NSString *json = @"\ +{\ + \"Image\": {\ + \"Width\": 800,\ + \"Height\": 600,\ + \"Title\": \"View from 15th Floor\",\ + \"Thumbnail\": {\ + \"Url\": \"http://www.example.com/image/481989943\",\ + \"Height\": 125,\ + \"Width\": \"100\"\ + },\ + },\ + \"emptyString\":\"\",\"emptyArray\":[],\"emptyObject\":{},\ + \"IDs\": [116, 943, 234, 38793],\ + \"escapeTest\": \"\\\"\\u0001\"\ +}"; + NSStringEncoding encs[] = {\ + NSUTF8StringEncoding,\ + NSUTF16LittleEndianStringEncoding,\ + NSUTF16BigEndianStringEncoding,\ + NSUTF32LittleEndianStringEncoding,\ + NSUTF32BigEndianStringEncoding}; + NSInputStream *is; + NSData *data; + id obj; + int i; + + for (i = 0; i < (sizeof(encs) / sizeof(NSStringEncoding)); i++) + { + NSError *e; + id tmp; + + data = [json dataUsingEncoding: encs[i]]; + tmp = [NSJSONSerialization JSONObjectWithData: data options: 0 error: &e]; + if (i > 0) { - NSData *data = [json dataUsingEncoding: encs[i]]; - NSError *e; - id tmp = [NSJSONSerialization JSONObjectWithData: data options: 0 error: &e]; - if (i > 0) - { - PASS([tmp isEqual: obj], "Decoding in different encodings give the same result"); - } - obj = tmp; + PASS([tmp isEqual: obj], + "Decoding in different encodings give the same result"); } - PASS([obj count] == 3, "Decoded dictionary had the right number of elements"); - PASS([NSJSONSerialization isValidJSONObject: obj], "Can serialise deserialised JSON"); - NSData *data = [NSJSONSerialization dataWithJSONObject: obj options: NSJSONWritingPrettyPrinted error: 0]; - PASS([obj isEqual: [NSJSONSerialization JSONObjectWithData: data options: 0 error: 0]], "Round trip worked with pretty printing"); - data = [NSJSONSerialization dataWithJSONObject: obj options: 0 error: 0]; - PASS([obj isEqual: [NSJSONSerialization JSONObjectWithData: data options: 0 error: 0]], "Round trip worked with ugly printing"); - PASS([obj isEqual: [NSJSONSerialization JSONObjectWithStream: [NSInputStream inputStreamWithData:data] options: 0 error: 0]], "Round trip worked through stream"); - return 0; + obj = tmp; + } + + PASS([obj count] == 6, + "Decoded dictionary had the right number of elements"); + PASS([NSJSONSerialization isValidJSONObject: obj], + "Can serialise deserialised JSON"); + + data = [NSJSONSerialization dataWithJSONObject: obj + options: NSJSONWritingPrettyPrinted error: 0]; + PASS_EQUAL([NSJSONSerialization JSONObjectWithData: data options: 0 error: 0], + obj, "Round trip worked with pretty printing"); + data = [NSJSONSerialization dataWithJSONObject: obj options: 0 error: 0]; + PASS_EQUAL([NSJSONSerialization JSONObjectWithData: data options: 0 error: 0], + obj, "Round trip worked with ugly printing"); + is = [NSInputStream inputStreamWithData: data]; + PASS_EQUAL([NSJSONSerialization JSONObjectWithStream: is options: 0 error: 0], + obj, "Round trip worked through stream"); + return 0; }