Browse Source

Improved handling of invalid types and missing data. (#53)

Brucey 1 month ago
parent
commit
d8c007a18b
2 changed files with 43 additions and 3 deletions
  1. 31 3
      jconv.mod/jconv.bmx
  2. 12 0
      jconv.mod/tests/test.bmx

+ 31 - 3
jconv.mod/jconv.bmx

@@ -158,6 +158,10 @@ Type TJConv
 	End Rem
 	Method FromJson:Object(json:String, typeName:String)
 		Local typeId:TTypeId = TTypeId.ForName(typeName)
+
+		If Not typeId Then
+			Throw TJconvDeserializeException.Create("Unknown type: " + typeName)
+		End If
 		
 		Return FromJson(json, typeId, Null)
 	End Method
@@ -171,7 +175,11 @@ Type TJConv
 		End If
 		
 		Local typeId:TTypeId = TTypeId.ForObject(obj)
-		
+
+		If Not typeId Then
+			Throw TJconvDeserializeException.Create("Unable to determine type from object.")
+		End If
+
 		Return FromJson(json, typeId, obj)
 	End Method
 
@@ -184,7 +192,11 @@ Type TJConv
 		End If
 		
 		Local typeId:TTypeId = TTypeId.ForObject(obj)
-		
+
+		If Not typeId Then
+			Throw TJconvDeserializeException.Create("Unable to determine type from object.")
+		End If
+
 		Return FromJson(json, typeId, obj)
 	End Method
 
@@ -194,6 +206,10 @@ Type TJConv
 	End Rem
 	Method FromJsonInstance:Object(json:TJSON, typeName:String)
 		Local typeId:TTypeId = TTypeId.ForName(typeName)
+
+		If Not typeId Then
+			Throw TJconvDeserializeException.Create("Unknown type: " + typeName)
+		End If
 		
 		Return FromJson(json, typeId, Null)
 	End Method
@@ -218,7 +234,11 @@ Type TJConv
 	End Rem
 	Method FromJson:Object(stream:TStream, typeName:String)
 		Local typeId:TTypeId = TTypeId.ForName(typeName)
-		
+
+		If Not typeId Then
+			Throw TJconvDeserializeException.Create("Unknown type: " + typeName)
+		End If
+
 		Return FromJson(stream, typeId, Null)
 	End Method
 	
@@ -235,6 +255,10 @@ Type TJConv
 
 	Method FromJson:Object(json:TJSON, typeId:TTypeId, obj:Object)
 
+		If Not typeId Then
+			Throw TJconvDeserializeException.Create("Missing typeId")
+		End If
+
 		Local serializer:TJConvSerializer = TJConvSerializer(options.serializers.ValueForKey(typeId.Name()))
 		If Not serializer Then
 			serializer = defaultSerializer
@@ -463,6 +487,10 @@ Type TJConv
 			Return
 		End If
 
+		If Not typeId Then
+			Throw TJconvDeserializeException.Create("Missing typeId")
+		End If
+
 		Local dims:Int
 		Try
 			dims = typeId.ArrayDimensions(array)

+ 12 - 0
jconv.mod/tests/test.bmx

@@ -415,6 +415,18 @@ Type TArrayTest Extends TJConvTest
 		assertEquals(JSON_STRING, jconv.ToJson(str))
 	End Method
 
+	Method testUnknownTypeThrows() { test }
+		Local json:String = "{ ~qunknownField~q: 123 }"
+		Local typeName:String = "TUnknown"
+
+		Try
+			Local obj:Object = jconv.FromJson(json, typeName)
+			Fail("Expected an exception for unknown type '" + typeName + "'")
+		Catch e:TBlitzException
+			assertTrue(e.ToString().Contains("TUnknown"))
+		End Try
+	End Method
+
 End Type
 
 Type TData