code: @Override
      public T read( String in, JsonDeserializationContext ctx ) throws JsonDeserializationException {
          JsonReader reader = ctx.newJsonReader( in );
  
          try {
  
              if ( ctx.isUnwrapRootValue() ) {
  
                  if ( JsonToken.BEGIN_OBJECT != reader.peek() ) {
                      throw ctx.traceError( "Unwrap root value is enabled but the input is not a JSON Object", reader );
                  }
                  reader.beginObject();
                  if ( JsonToken.END_OBJECT == reader.peek() ) {
                      throw ctx.traceError( "Unwrap root value is enabled but the JSON Object is empty", reader );
                  }
                  String name = reader.nextName();
                  if ( !name.equals( rootName ) ) {
                      throw ctx.traceError( "Unwrap root value is enabled but the name '" + name + "' don't match the expected rootName " +
                              "'" + rootName + "'", reader );
                  }
                  T result = getDeserializer().deserialize( reader, ctx );
                  reader.endObject();
                  return result;
  
              } else {
  
                  return getDeserializer().deserialize( reader, ctx );
  
              }
  
          } catch ( JsonDeserializationException e ) {
              // already logged, we just throw it
              throw e;
          } catch ( RuntimeException e ) {
              throw ctx.traceError( e, reader );
          }
      }
docs: {@inheritDoc}