From d952b3bcb7ed5c4ede2c246e560b0519030ac289 Mon Sep 17 00:00:00 2001 From: Ziver Koc Date: Wed, 28 Oct 2015 16:01:24 +0100 Subject: [PATCH] Bugfix for list and maps containing null objects --- src/zutil/parser/json/JSONParser.java | 28 ++++++++++++++-------- test/zutil/test/JSONParserTest.java | 34 +++++++++++++++++++++------ 2 files changed, 45 insertions(+), 17 deletions(-) mode change 100644 => 100755 src/zutil/parser/json/JSONParser.java mode change 100644 => 100755 test/zutil/test/JSONParserTest.java diff --git a/src/zutil/parser/json/JSONParser.java b/src/zutil/parser/json/JSONParser.java old mode 100644 new mode 100755 index fded672..9249ae9 --- a/src/zutil/parser/json/JSONParser.java +++ b/src/zutil/parser/json/JSONParser.java @@ -38,6 +38,11 @@ import java.util.regex.Pattern; * @author Ziver */ public class JSONParser extends Parser { + // Values for MutableInt + private static final int CONTINUE = 0; + private static final int END_WITH_NULL = 1; + private static final int END_WITH_VALUE = 2; + // Regex for parsing primitives private static final Pattern NUMBER_PATTERN = Pattern.compile("^[0-9.]++$"); private static final Pattern BOOLEAN_PATTERN = Pattern.compile("^(true|false)$", Pattern.CASE_INSENSITIVE); private static final Pattern NULL_PATTERN = Pattern.compile("^null$", Pattern.CASE_INSENSITIVE); @@ -85,7 +90,7 @@ public class JSONParser extends Parser { DataNode root = null; DataNode key = null; DataNode node = null; - end.i = 0; + end.i = CONTINUE; int c = '_'; while((c=in.read()) >= 0 && @@ -93,7 +98,7 @@ public class JSONParser extends Parser { switch( c ){ // End of stream - case -1: break; + case -1: // This is the end of an Map or List case ']': case '}': @@ -103,18 +108,21 @@ public class JSONParser extends Parser { // Parse Map case '{': root = new DataNode(DataType.Map); - while(end.i != 1 && - (key = parse(in, end)) != null && - (node = parse(in, end)) != null){ - root.set( key.toString(), node ); + while(end.i == CONTINUE) { + key = parse(in, end); + node = parse(in, end); + if(end.i != END_WITH_NULL) + root.set( key.toString(), node ); } end.i = 0; break; // Parse List case '[': root = new DataNode(DataType.List); - while(end.i != 1 && (node = parse(in, end)) != null){ - root.add( node ); + while(end.i == CONTINUE){ + node = parse(in, end); + if(end.i != END_WITH_NULL) + root.add( node ); } end.i = 0; break; @@ -130,9 +138,9 @@ public class JSONParser extends Parser { // Parse unknown type default: StringBuilder tmp = new StringBuilder().append((char)c); - while((c=in.read()) >= 0 && c != ',' && c != '='){ + while((c=in.read()) >= 0 && c != ',' && c != ':'){ if(c == ']' || c == '}'){ - end.i = 1; + end.i = END_WITH_VALUE; break; } tmp.append((char)c); diff --git a/test/zutil/test/JSONParserTest.java b/test/zutil/test/JSONParserTest.java old mode 100644 new mode 100755 index 820b226..9290d6b --- a/test/zutil/test/JSONParserTest.java +++ b/test/zutil/test/JSONParserTest.java @@ -49,14 +49,14 @@ public class JSONParserTest { @Test public void emptyMap(){ DataNode data = JSONParser.read("{}"); - assert(data.isMap()); + assertEquals(DataType.Map, data.getType()); assertEquals( 0, data.size()); } @Test public void emptyList(){ DataNode data = JSONParser.read("[]"); - assert(data.isList()); + assertEquals(DataType.List, data.getType()); assertEquals( 0, data.size()); } @@ -103,7 +103,7 @@ public class JSONParserTest { @Test public void toManyCommasInList(){ DataNode data = JSONParser.read("[1,2,3,]"); - assert(data.isList()); + assertEquals(DataType.List, data.getType()); assertEquals( 1, data.get(0).getInt()); assertEquals( 2, data.get(1).getInt()); assertEquals( 3, data.get(2).getInt()); @@ -111,13 +111,33 @@ public class JSONParserTest { @Test public void toManyCommasInMap(){ - DataNode data = JSONParser.read("{1=1,2=2,3=3,}"); - assert(data.isMap()); + DataNode data = JSONParser.read("{1:1,2:2,3:3,}"); + assertEquals(DataType.Map, data.getType()); assertEquals( 1, data.get("1").getInt()); assertEquals( 2, data.get("2").getInt()); assertEquals( 3, data.get("3").getInt()); } + @Test + public void nullValueInList(){ + DataNode data = JSONParser.read("[1,null,3,]"); + assertEquals(DataType.List, data.getType()); + assertEquals(3, data.size()); + assertEquals( "1", data.get(0).getString()); + assertNull(data.get(1)); + assertEquals( "3", data.get(2).getString()); + } + + @Test + public void nullValueInMap(){ + DataNode data = JSONParser.read("{1:1,2:null,3:3,}"); + assertEquals(DataType.Map, data.getType()); + assertEquals(3, data.size()); + assertEquals( "1", data.getString("1")); + assertNull(data.get("2")); + assertEquals( "3", data.getString("3")); + } + @Test public void complexMap() { String json = "{" + @@ -137,14 +157,14 @@ public class JSONParserTest { assertEquals( "91011", data.get("test4").getString() ); assert( data.get("test5").isList() ); - assertEquals( 4, data.get("test5").size() ); + assertEquals( 4, data.get("test5").size() ); assertEquals( 12, data.get("test5").get(0).getInt() ); assertEquals( 13, data.get("test5").get(1).getInt() ); assertEquals( 14, data.get("test5").get(2).getInt() ); assertEquals( 15, data.get("test5").get(3).getInt() ); assert( data.get("test6").isList() ); - assertEquals( 4, data.get("test6").size() ); + assertEquals( 4, data.get("test6").size() ); assertEquals( "a", data.get("test6").get(0).getString() ); assertEquals( "b", data.get("test6").get(1).getString() ); assertEquals( "c", data.get("test6").get(2).getString() );