Provide factory to obtain JsonValue from java.lang.Number (#302)

Signed-off-by: Jorge Bescos Gascon <jorge.bescos.gascon@oracle.com>
diff --git a/api/src/main/java/jakarta/json/Json.java b/api/src/main/java/jakarta/json/Json.java
index 60263b0..501ec40 100644
--- a/api/src/main/java/jakarta/json/Json.java
+++ b/api/src/main/java/jakarta/json/Json.java
@@ -517,4 +517,15 @@
         return escaped.replace("~1", "/").replace("~0", "~");
     }
 
+    /**
+     * Creates a JsonNumber.
+     *
+     * @param value a JSON number
+     * @return the JsonNumber for the number
+     *
+     * @since 2.1
+     */
+    public static JsonNumber createValue(Number value) {
+        return JsonProvider.provider().createValue(value);
+    }
 }
diff --git a/api/src/main/java/jakarta/json/spi/JsonProvider.java b/api/src/main/java/jakarta/json/spi/JsonProvider.java
index 8aad303..6cc7edb 100644
--- a/api/src/main/java/jakarta/json/spi/JsonProvider.java
+++ b/api/src/main/java/jakarta/json/spi/JsonProvider.java
@@ -477,4 +477,32 @@
     public JsonNumber createValue(BigInteger value) {
         throw new UnsupportedOperationException();
     }
+
+    /**
+     * Creates a JsonNumber.
+     *
+     * When it is not implemented it checks the type and delegates
+     * to an existing method that already handles that type. It throws
+     * UnsupportedOperationException in case the type is not known.
+     *
+     * @param number a JSON number
+     * @return the JsonNumber for the number
+     *
+     * @since 2.1
+     */
+    public JsonNumber createValue(Number number) {
+        if (number instanceof Integer) {
+            return createValue(number.intValue());
+        } else if (number instanceof Long) {
+            return createValue(number.longValue());
+        } else if (number instanceof Double) {
+            return createValue(number.doubleValue());
+        } else if (number instanceof BigInteger) {
+            return createValue((BigInteger) number);
+        } else if (number instanceof BigDecimal) {
+            return createValue((BigDecimal) number);
+        } else {
+            throw new UnsupportedOperationException(number + " type is not known");
+        }
+    }
 }