code: @SuppressWarnings({ "unchecked" })
  	protected final <D> D nullSafeValue(JsonNode jsonNode, Class<D> type) {
  		Assert.notNull(type, "Type must not be null");
  		if (jsonNode == null) {
  			return null;
  		}
  		if (type == String.class) {
  			return (D) jsonNode.textValue();
  		}
  		if (type == Boolean.class) {
  			return (D) Boolean.valueOf(jsonNode.booleanValue());
  		}
  		if (type == Long.class) {
  			return (D) Long.valueOf(jsonNode.longValue());
  		}
  		if (type == Integer.class) {
  			return (D) Integer.valueOf(jsonNode.intValue());
  		}
  		if (type == Short.class) {
  			return (D) Short.valueOf(jsonNode.shortValue());
  		}
  		if (type == Double.class) {
  			return (D) Double.valueOf(jsonNode.doubleValue());
  		}
  		if (type == Float.class) {
  			return (D) Float.valueOf(jsonNode.floatValue());
  		}
  		if (type == BigDecimal.class) {
  			return (D) jsonNode.decimalValue();
  		}
  		if (type == BigInteger.class) {
  			return (D) jsonNode.bigIntegerValue();
  		}
  		throw new IllegalArgumentException("Unsupported value type " + type.getName());
  	}
docs: Helper method to extract a value from the given {@code jsonNode} or return
  {@code null} when the node itself is {@code null}.
  @param jsonNode the source node (may be {@code null})
  @param type the data type. May be {@link String}, {@link Boolean}, {@link Long},
  {@link Integer}, {@link Short}, {@link Double}, {@link Float}, {@link BigDecimal}
  or {@link BigInteger}.
  @param <D> the data type requested
  @return the node value or {@code null}