core/src/main/java/com/orientechnologies/orient/core/sql/parser/OJson.java
public Object toObjectDetermineType(OResult source, OCommandContext ctx){
    String className = getClassNameForDocument(ctx);
    String type = getTypeForDocument(ctx);
    if (className != null || (type != null && "d".equalsIgnoreCase(type))) {
      return toDocument(source, ctx, className);
    }
    else{
      return toMap(source, ctx);
    }
  }
public Object toObjectDetermineType(OResult source, OCommandContext ctx){
    String className = getClassNameForDocument(ctx);
    String type = getTypeForDocument(ctx);
    if (className != null || (type != null && "d".equalsIgnoreCase(type))) {
      return toDocument(source, ctx, className);
    }
    else{
      return toMap(source, ctx);
    }
  }
choosing return type is based on existence of @class and @type field in JSON
@param source
@param ctx
@return