Bugfix for list and maps containing null objects
This commit is contained in:
parent
304213c1d2
commit
d952b3bcb7
2 changed files with 45 additions and 17 deletions
28
src/zutil/parser/json/JSONParser.java
Normal file → Executable file
28
src/zutil/parser/json/JSONParser.java
Normal file → Executable 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
34
test/zutil/test/JSONParserTest.java
Normal file → Executable 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() );
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue