Categories:
Audio (13)
Biotech (29)
Bytecode (36)
Database (77)
Framework (7)
Game (7)
General (507)
Graphics (53)
I/O (35)
IDE (2)
JAR Tools (102)
JavaBeans (21)
JDBC (121)
JDK (426)
JSP (20)
Logging (108)
Mail (58)
Messaging (8)
Network (84)
PDF (97)
Report (7)
Scripting (84)
Security (32)
Server (121)
Servlet (26)
SOAP (24)
Testing (54)
Web (15)
XML (322)
Collections:
Other Resources:
Jackson Data Binding Source Code
Jackson is "the Java JSON library" or "the best JSON parser for Java". Or simply as "JSON for Java".
Jackson Databind Source Code files are provided in the source packge (jackson-databind-2.14.0-sources.jar). You can download it at Jackson Maven Website.
You can also browse Jackson Databind Source Code below:
✍: FYIcenter.com
⏎ com/fasterxml/jackson/databind/deser/std/FromStringDeserializer.java
package com.fasterxml.jackson.databind.deser.std;
import java.io.*;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.nio.charset.Charset;
import java.util.Currency;
import java.util.IllformedLocaleException;
import java.util.Locale;
import java.util.TimeZone;
import java.util.regex.Pattern;
import com.fasterxml.jackson.core.*;
import com.fasterxml.jackson.core.util.VersionUtil;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.databind.cfg.CoercionAction;
import com.fasterxml.jackson.databind.cfg.CoercionInputShape;
import com.fasterxml.jackson.databind.exc.InvalidFormatException;
import com.fasterxml.jackson.databind.type.LogicalType;
import com.fasterxml.jackson.databind.util.ClassUtil;
/**
* Base class for simple deserializers that serialize values from String
* representation: this includes JSON Strings and other Scalar values that
* can be coerced into text, like Numbers and Booleans).
* Simple JSON String values are trimmed using {@link java.lang.String#trim}.
* Partial deserializer implementation will try to first access current token as
* a String, calls {@code _deserialize(String,DeserializationContext)} and
* returns return value.
* If this does not work (current token not a simple scalar type), attempts
* are made so that:
*<ul>
* <li>Embedded values ({@link JsonToken#VALUE_EMBEDDED_OBJECT}) are returned as-is
* if they are of compatible type
* </li>
* <li>Arrays may be "unwrapped" if (and only if) {@link DeserializationFeature#UNWRAP_SINGLE_VALUE_ARRAYS}
* is enabled, and array contains just a single scalar value that can be deserialized
* (for example, JSON Array with single JSON String element).
* </li>
* </ul>
*<p>
* Special handling includes:
* <ul>
* <li>Null values ({@link JsonToken#VALUE_NULL}) are handled by returning value
* returned by {@link JsonDeserializer#getNullValue(DeserializationContext)}: default
* implementation simply returns Java `null` but this may be overridden.
* </li>
* <li>Empty String (after trimming) will result in {@link #_deserializeFromEmptyString}
* getting called, and return value being returned as deserialization: default implementation
* simply returns `null`.
* </li>
* </ul>
*/
@SuppressWarnings("serial")
public abstract class FromStringDeserializer<T> extends StdScalarDeserializer<T>
{
public static Class<?>[] types() {
return new Class<?>[] {
File.class,
URL.class,
URI.class,
Class.class,
JavaType.class,
Currency.class,
Pattern.class,
Locale.class,
Charset.class,
TimeZone.class,
InetAddress.class,
InetSocketAddress.class,
// Special impl:
StringBuilder.class,
StringBuffer.class, // since 2.13.3
};
}
/*
/**********************************************************
/* Life-cycle
/**********************************************************
*/
protected FromStringDeserializer(Class<?> vc) {
super(vc);
}
/**
* Factory method for trying to find a deserializer for one of supported
* types that have simple from-String serialization.
*/
public static FromStringDeserializer<?> findDeserializer(Class<?> rawType)
{
int kind = 0;
if (rawType == File.class) {
kind = Std.STD_FILE;
} else if (rawType == URL.class) {
kind = Std.STD_URL;
} else if (rawType == URI.class) {
kind = Std.STD_URI;
} else if (rawType == Class.class) {
kind = Std.STD_CLASS;
} else if (rawType == JavaType.class) {
kind = Std.STD_JAVA_TYPE;
} else if (rawType == Currency.class) {
kind = Std.STD_CURRENCY;
} else if (rawType == Pattern.class) {
kind = Std.STD_PATTERN;
} else if (rawType == Locale.class) {
kind = Std.STD_LOCALE;
} else if (rawType == Charset.class) {
kind = Std.STD_CHARSET;
} else if (rawType == TimeZone.class) {
kind = Std.STD_TIME_ZONE;
} else if (rawType == InetAddress.class) {
kind = Std.STD_INET_ADDRESS;
} else if (rawType == InetSocketAddress.class) {
kind = Std.STD_INET_SOCKET_ADDRESS;
} else if (rawType == StringBuilder.class) {
return new StringBuilderDeserializer();
} else if (rawType == StringBuffer.class) { // since 2.13.3
return new StringBufferDeserializer();
} else {
return null;
}
return new Std(rawType, kind);
}
@Override // since 2.12
public LogicalType logicalType() {
return LogicalType.OtherScalar;
}
/*
/**********************************************************
/* Deserializer implementations
/**********************************************************
*/
@SuppressWarnings("unchecked")
@Override
public T deserialize(JsonParser p, DeserializationContext ctxt) throws IOException
{
// Let's get textual value, possibly via coercion from other scalar types
String text = p.getValueAsString();
if (text == null) {
JsonToken t = p.currentToken();
if (t != JsonToken.START_OBJECT) {
return (T) _deserializeFromOther(p, ctxt, t);
}
// 29-Jun-2020, tatu: New! "Scalar from Object" (mostly for XML)
text = ctxt.extractScalarFromObject(p, this, _valueClass);
}
if (text.isEmpty()) {
// 09-Jun-2020, tatu: Commonly `null` but may coerce to "empty" as well
return (T) _deserializeFromEmptyString(ctxt);
}
if (_shouldTrim()) {
final String old = text;
text = text.trim();
if (text != old) {
if (text.isEmpty()) {
return (T) _deserializeFromEmptyString(ctxt);
}
}
}
Exception cause = null;
try {
// 19-May-2017, tatu: Used to require non-null result (assuming `null`
// indicated error; but that seems wrong. Should be able to return
// `null` as value.
return _deserialize(text, ctxt);
} catch (IllegalArgumentException | MalformedURLException e) {
cause = e;
}
// note: `cause` can't be null
String msg = "not a valid textual representation";
String m2 = cause.getMessage();
if (m2 != null) {
msg = msg + ", problem: "+m2;
}
// 05-May-2016, tatu: Unlike most usage, this seems legit, so...
throw ctxt.weirdStringException(text, _valueClass, msg)
.withCause(cause);
}
/**
* Main method from trying to deserialize actual value from non-empty
* String.
*/
protected abstract T _deserialize(String value, DeserializationContext ctxt) throws IOException;
// @since 2.13.1
protected boolean _shouldTrim() {
return true;
}
// @since 2.12
protected Object _deserializeFromOther(JsonParser p, DeserializationContext ctxt,
JsonToken t) throws IOException
{
// [databind#381]
if (t == JsonToken.START_ARRAY) {
return _deserializeFromArray(p, ctxt);
}
if (t == JsonToken.VALUE_EMBEDDED_OBJECT) {
// Trivial cases; null to null, instance of type itself returned as is
Object ob = p.getEmbeddedObject();
if (ob == null) {
return null;
}
if (_valueClass.isAssignableFrom(ob.getClass())) {
return ob;
}
return _deserializeEmbedded(ob, ctxt);
}
return ctxt.handleUnexpectedToken(_valueClass, p);
}
/**
* Overridable method to allow coercion from embedded value that is neither
* {@code null} nor directly assignable to target type.
* Used, for example, by {@link UUIDDeserializer} to coerce from {@code byte[]}.
*/
protected T _deserializeEmbedded(Object ob, DeserializationContext ctxt) throws IOException {
// default impl: error out
ctxt.reportInputMismatch(this,
"Don't know how to convert embedded Object of type %s into %s",
ob.getClass().getName(), _valueClass.getName());
return null;
}
@Deprecated // since 2.12 -- override variant that takes context
protected final T _deserializeFromEmptyString() throws IOException {
return null;
}
/**
* @since 2.12
*/
protected Object _deserializeFromEmptyString(DeserializationContext ctxt) throws IOException {
CoercionAction act = ctxt.findCoercionAction(logicalType(), _valueClass,
CoercionInputShape.EmptyString);
if (act == CoercionAction.Fail) {
ctxt.reportInputMismatch(this,
"Cannot coerce empty String (\"\") to %s (but could if enabling coercion using `CoercionConfig`)",
_coercedTypeDesc());
}
if (act == CoercionAction.AsNull) {
return getNullValue(ctxt);
}
if (act == CoercionAction.AsEmpty) {
return getEmptyValue(ctxt);
}
// 09-Jun-2020, tatu: semantics for `TryConvert` are bit interesting due to
// historical reasons
return _deserializeFromEmptyStringDefault(ctxt);
}
/**
* @since 2.12
*/
protected Object _deserializeFromEmptyStringDefault(DeserializationContext ctxt) throws IOException {
// by default, "as-null", but overridable by sub-classes
return getNullValue(ctxt);
}
/*
/**********************************************************
/* A general-purpose implementation
/**********************************************************
*/
/**
* "Chameleon" deserializer that works on simple types that are deserialized
* from a simple String.
*
* @since 2.4
*/
public static class Std extends FromStringDeserializer<Object>
{
private static final long serialVersionUID = 1;
public final static int STD_FILE = 1;
public final static int STD_URL = 2;
public final static int STD_URI = 3;
public final static int STD_CLASS = 4;
public final static int STD_JAVA_TYPE = 5;
public final static int STD_CURRENCY = 6;
public final static int STD_PATTERN = 7;
public final static int STD_LOCALE = 8;
public final static int STD_CHARSET = 9;
public final static int STD_TIME_ZONE = 10;
public final static int STD_INET_ADDRESS = 11;
public final static int STD_INET_SOCKET_ADDRESS = 12;
// No longer implemented here since 2.12
// public final static int STD_STRING_BUILDER = 13;
protected final static String LOCALE_EXT_MARKER = "_#";
protected final int _kind;
protected Std(Class<?> valueType, int kind) {
super(valueType);
_kind = kind;
}
@Override
protected Object _deserialize(String value, DeserializationContext ctxt) throws IOException
{
switch (_kind) {
case STD_FILE:
return new File(value);
case STD_URL:
return new URL(value);
case STD_URI:
return URI.create(value);
case STD_CLASS:
try {
return ctxt.findClass(value);
} catch (Exception e) {
return ctxt.handleInstantiationProblem(_valueClass, value,
ClassUtil.getRootCause(e));
}
case STD_JAVA_TYPE:
return ctxt.getTypeFactory().constructFromCanonical(value);
case STD_CURRENCY:
// will throw IAE if unknown:
return Currency.getInstance(value);
case STD_PATTERN:
// will throw IAE (or its subclass) if malformed
return Pattern.compile(value);
case STD_LOCALE:
return _deserializeLocale(value, ctxt);
case STD_CHARSET:
return Charset.forName(value);
case STD_TIME_ZONE:
return TimeZone.getTimeZone(value);
case STD_INET_ADDRESS:
return InetAddress.getByName(value);
case STD_INET_SOCKET_ADDRESS:
if (value.startsWith("[")) {
// bracketed IPv6 (with port number)
int i = value.lastIndexOf(']');
if (i == -1) {
throw new InvalidFormatException(ctxt.getParser(),
"Bracketed IPv6 address must contain closing bracket",
value, InetSocketAddress.class);
}
int j = value.indexOf(':', i);
int port = j > -1 ? Integer.parseInt(value.substring(j + 1)) : 0;
return new InetSocketAddress(value.substring(0, i + 1), port);
}
int ix = value.indexOf(':');
if (ix >= 0 && value.indexOf(':', ix + 1) < 0) {
// host:port
int port = Integer.parseInt(value.substring(ix+1));
return new InetSocketAddress(value.substring(0, ix), port);
}
// host or unbracketed IPv6, without port number
return new InetSocketAddress(value, 0);
}
VersionUtil.throwInternal();
return null;
}
@Override // since 2.12
public Object getEmptyValue(DeserializationContext ctxt)
throws JsonMappingException
{
switch (_kind) {
case STD_URI:
// As per [databind#398], URI requires special handling
return URI.create("");
case STD_LOCALE:
// As per [databind#1123], Locale too
return Locale.ROOT;
}
return super.getEmptyValue(ctxt);
}
@Override
protected Object _deserializeFromEmptyStringDefault(DeserializationContext ctxt) throws IOException {
// 09-Jun-2020, tatu: For backwards compatibility deserialize "as-empty"
// as URI and Locale did that in 2.11 (and StringBuilder probably ought to).
// But doing this here instead of super-class lets UUID return "as-null" instead
return getEmptyValue(ctxt);
}
// @since 2.13.1
@Override
protected boolean _shouldTrim() {
// 04-Dec-2021, tatu: For [databund#3290]
return (_kind != STD_PATTERN);
}
protected int _firstHyphenOrUnderscore(String str)
{
for (int i = 0, end = str.length(); i < end; ++i) {
char c = str.charAt(i);
if (c == '_' || c == '-') {
return i;
}
}
return -1;
}
private Locale _deserializeLocale(String value, DeserializationContext ctxt)
throws IOException
{
int ix = _firstHyphenOrUnderscore(value);
if (ix < 0) { // single argument
return new Locale(value);
}
String first = value.substring(0, ix);
value = value.substring(ix+1);
ix = _firstHyphenOrUnderscore(value);
if (ix < 0) { // two pieces
return new Locale(first, value);
}
String second = value.substring(0, ix);
// [databind#3259]: Support for BCP 47 java.util.Locale ser/deser
int extMarkerIx = value.indexOf(LOCALE_EXT_MARKER);
if (extMarkerIx < 0) {
return new Locale(first, second, value.substring(ix+1));
}
return _deSerializeBCP47Locale(value, ix, first, second, extMarkerIx);
}
private Locale _deSerializeBCP47Locale(String value, int ix, String first, String second,
int extMarkerIx)
{
String third = "";
try {
// Below condition checks if variant value is present to handle empty variant values such as
// en__#Latn_x-ext
// _US_#Latn
if (extMarkerIx > 0 && extMarkerIx > ix) {
third = value.substring(ix + 1, extMarkerIx);
}
value = value.substring(extMarkerIx + 2);
int underscoreIx = value.indexOf('_');
if (underscoreIx < 0) {
int hyphenIx = value.indexOf('-');
if (hyphenIx < 0) {
return new Locale.Builder().setLanguage(first)
.setRegion(second)
.setVariant(third)
.setScript(value)
.build();
}
return new Locale.Builder().setLanguage(first)
.setRegion(second).setVariant(third)
.setExtension(value.charAt(0), value.substring(hyphenIx + 1))
.build();
}
final int len = value.length();
Locale.Builder b = new Locale.Builder()
.setLanguage(first)
.setRegion(second).setVariant(third)
.setScript(value.substring(0, underscoreIx));
if ((underscoreIx + 1) < len) {
b = b.setExtension(value.charAt(underscoreIx + 1),
value.substring(Math.min(len, underscoreIx + 3)));
}
return b.build();
} catch (IllformedLocaleException ex) {
// should we really just swallow the exception?
return new Locale(first, second, third);
}
}
}
// @since 2.12 to simplify logic a bit: should not use coercions when reading
static class StringBuilderDeserializer extends FromStringDeserializer<Object>
{
public StringBuilderDeserializer() {
super(StringBuilder.class);
}
@Override
public LogicalType logicalType() {
return LogicalType.Textual;
}
@Override
public Object getEmptyValue(DeserializationContext ctxt)
throws JsonMappingException
{
return new StringBuilder();
}
@Override
public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException
{
String text = p.getValueAsString();
if (text != null) {
return _deserialize(text, ctxt);
}
return super.deserialize(p, ctxt);
}
@Override
protected Object _deserialize(String value, DeserializationContext ctxt)
throws IOException
{
return new StringBuilder(value);
}
}
// @since 2.13.3: duplicated code but for only 2 impls base class seems unnecessary
static class StringBufferDeserializer extends FromStringDeserializer<Object>
{
public StringBufferDeserializer() { super(StringBuffer.class); }
@Override
public LogicalType logicalType() { return LogicalType.Textual; }
@Override
public Object getEmptyValue(DeserializationContext ctxt) {
return new StringBuffer();
}
@Override
public Object deserialize(JsonParser p, DeserializationContext ctxt) throws IOException
{
String text = p.getValueAsString();
if (text != null) {
return _deserialize(text, ctxt);
}
return super.deserialize(p, ctxt);
}
@Override
protected Object _deserialize(String value, DeserializationContext ctxt)
throws IOException
{
return new StringBuffer(value);
}
}
}
⏎ com/fasterxml/jackson/databind/deser/std/FromStringDeserializer.java
Or download all of them as a single archive file:
File name: jackson-databind-2.14.0-sources.jar File size: 1187952 bytes Release date: 2022-11-05 Download
⇒ Jackson Annotations Source Code
⇐ Download and Install Jackson Binary Package
2022-03-29, ≈203🔥, 0💬
Popular Posts:
JDK 11 jdk.localedata.jmod is the JMOD file for JDK 11 Localedata module. JDK 11 Locale Data module ...
JDK 7 tools.jar is the JAR file for JDK 7 tools. It contains Java classes to support different JDK t...
JDK 17 java.compiler.jmod is the JMOD file for JDK 17 Compiler module. JDK 17 Compiler module compil...
Where to get the Java source code for Connector/J 8.0 Protocol Impl module? Java source code files f...
Woodstox 6.4.0 Source Code Files are provided at the Woodstox GitHub Website . You can download them...