Bugfix for list and maps containing null objects

This commit is contained in:
Ziver Koc 2015-10-28 16:01:24 +01:00
parent 304213c1d2
commit d952b3bcb7
2 changed files with 45 additions and 17 deletions

28
src/zutil/parser/json/JSONParser.java Normal file → Executable file
View file

@ -38,6 +38,11 @@ import java.util.regex.Pattern;
* @author Ziver * @author Ziver
*/ */
public class JSONParser extends Parser { 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 NUMBER_PATTERN = Pattern.compile("^[0-9.]++$");
private static final Pattern BOOLEAN_PATTERN = Pattern.compile("^(true|false)$", Pattern.CASE_INSENSITIVE); 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); 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 root = null;
DataNode key = null; DataNode key = null;
DataNode node = null; DataNode node = null;
end.i = 0; end.i = CONTINUE;
int c = '_'; int c = '_';
while((c=in.read()) >= 0 && while((c=in.read()) >= 0 &&
@ -93,7 +98,7 @@ public class JSONParser extends Parser {
switch( c ){ switch( c ){
// End of stream // End of stream
case -1: break; case -1:
// This is the end of an Map or List // This is the end of an Map or List
case ']': case ']':
case '}': case '}':
@ -103,18 +108,21 @@ public class JSONParser extends Parser {
// Parse Map // Parse Map
case '{': case '{':
root = new DataNode(DataType.Map); root = new DataNode(DataType.Map);
while(end.i != 1 && while(end.i == CONTINUE) {
(key = parse(in, end)) != null && key = parse(in, end);
(node = parse(in, end)) != null){ node = parse(in, end);
root.set( key.toString(), node ); if(end.i != END_WITH_NULL)
root.set( key.toString(), node );
} }
end.i = 0; end.i = 0;
break; break;
// Parse List // Parse List
case '[': case '[':
root = new DataNode(DataType.List); root = new DataNode(DataType.List);
while(end.i != 1 && (node = parse(in, end)) != null){ while(end.i == CONTINUE){
root.add( node ); node = parse(in, end);
if(end.i != END_WITH_NULL)
root.add( node );
} }
end.i = 0; end.i = 0;
break; break;
@ -130,9 +138,9 @@ public class JSONParser extends Parser {
// Parse unknown type // Parse unknown type
default: default:
StringBuilder tmp = new StringBuilder().append((char)c); StringBuilder tmp = new StringBuilder().append((char)c);
while((c=in.read()) >= 0 && c != ',' && c != '='){ while((c=in.read()) >= 0 && c != ',' && c != ':'){
if(c == ']' || c == '}'){ if(c == ']' || c == '}'){
end.i = 1; end.i = END_WITH_VALUE;
break; break;
} }
tmp.append((char)c); tmp.append((char)c);

34
test/zutil/test/JSONParserTest.java Normal file → Executable file
View file

@ -49,14 +49,14 @@ public class JSONParserTest {
@Test @Test
public void emptyMap(){ public void emptyMap(){
DataNode data = JSONParser.read("{}"); DataNode data = JSONParser.read("{}");
assert(data.isMap()); assertEquals(DataType.Map, data.getType());
assertEquals( 0, data.size()); assertEquals( 0, data.size());
} }
@Test @Test
public void emptyList(){ public void emptyList(){
DataNode data = JSONParser.read("[]"); DataNode data = JSONParser.read("[]");
assert(data.isList()); assertEquals(DataType.List, data.getType());
assertEquals( 0, data.size()); assertEquals( 0, data.size());
} }
@ -103,7 +103,7 @@ public class JSONParserTest {
@Test @Test
public void toManyCommasInList(){ public void toManyCommasInList(){
DataNode data = JSONParser.read("[1,2,3,]"); DataNode data = JSONParser.read("[1,2,3,]");
assert(data.isList()); assertEquals(DataType.List, data.getType());
assertEquals( 1, data.get(0).getInt()); assertEquals( 1, data.get(0).getInt());
assertEquals( 2, data.get(1).getInt()); assertEquals( 2, data.get(1).getInt());
assertEquals( 3, data.get(2).getInt()); assertEquals( 3, data.get(2).getInt());
@ -111,13 +111,33 @@ public class JSONParserTest {
@Test @Test
public void toManyCommasInMap(){ public void toManyCommasInMap(){
DataNode data = JSONParser.read("{1=1,2=2,3=3,}"); DataNode data = JSONParser.read("{1:1,2:2,3:3,}");
assert(data.isMap()); assertEquals(DataType.Map, data.getType());
assertEquals( 1, data.get("1").getInt()); assertEquals( 1, data.get("1").getInt());
assertEquals( 2, data.get("2").getInt()); assertEquals( 2, data.get("2").getInt());
assertEquals( 3, data.get("3").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 @Test
public void complexMap() { public void complexMap() {
String json = "{" + String json = "{" +
@ -137,14 +157,14 @@ public class JSONParserTest {
assertEquals( "91011", data.get("test4").getString() ); assertEquals( "91011", data.get("test4").getString() );
assert( data.get("test5").isList() ); 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( 12, data.get("test5").get(0).getInt() );
assertEquals( 13, data.get("test5").get(1).getInt() ); assertEquals( 13, data.get("test5").get(1).getInt() );
assertEquals( 14, data.get("test5").get(2).getInt() ); assertEquals( 14, data.get("test5").get(2).getInt() );
assertEquals( 15, data.get("test5").get(3).getInt() ); assertEquals( 15, data.get("test5").get(3).getInt() );
assert( data.get("test6").isList() ); 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( "a", data.get("test6").get(0).getString() );
assertEquals( "b", data.get("test6").get(1).getString() ); assertEquals( "b", data.get("test6").get(1).getString() );
assertEquals( "c", data.get("test6").get(2).getString() ); assertEquals( "c", data.get("test6").get(2).getString() );