                 return true
             }
             
+        case let .JSONStringOptional:
+            if self.isNull() || self.asString() != nil {
+                return true
+            }
+            
+        case let .JSONNumberOptional:
+            if self.isNull() || self.asNumber() != nil {
+                return true
+            }
+            
         case let .JSONDictionary(descriptionDictionary):
             
             var isValid = true

    case JSONString
    case JSONNumber
    case JSONBool
}

public extension JSONValue {

            if let dictionary = self.asDictionary() {
                
                for (key, value) in descriptionDictionary {
                        if dictionary[key] != nil && !dictionary[key]!.matchesDescription(value) {
                            isValid = false
                        }
                }
                
            } else {
