/** objTypePair.getObject() must not be null */
 @SuppressWarnings({"unchecked", "rawtypes"})
 private JsonElement findAndInvokeCustomSerializer(ObjectTypePair objTypePair) {
   Pair<JsonSerializer<?>, ObjectTypePair> pair = objTypePair.getMatchingHandler(serializers);
   if (pair == null) {
     return null;
   }
   JsonSerializer serializer = pair.first;
   objTypePair = pair.second;
   start(objTypePair);
   try {
     JsonElement element =
         serializer.serialize(objTypePair.getObject(), objTypePair.getType(), context);
     return element == null ? JsonNull.createJsonNull() : element;
   } finally {
     end(objTypePair);
   }
 }
 private void addAsArrayElement(ObjectTypePair elementTypePair) {
   if (elementTypePair.getObject() == null) {
     root.getAsJsonArray().add(JsonNull.createJsonNull());
   } else {
     JsonElement childElement = getJsonElementForChild(elementTypePair);
     root.getAsJsonArray().add(childElement);
   }
 }
Example #3
0
 /**
  * Navigate all the fields of the specified object. If a field is null, it does not get visited.
  */
 public void accept(Visitor visitor) {
   TypeInfo objTypeInfo = new TypeInfo(objTypePair.type);
   if (exclusionStrategy.shouldSkipClass(objTypeInfo.getRawClass())) {
     return;
   }
   boolean visitedWithCustomHandler = visitor.visitUsingCustomHandler(objTypePair);
   if (!visitedWithCustomHandler) {
     Object obj = objTypePair.getObject();
     Object objectToVisit = (obj == null) ? visitor.getTarget() : obj;
     if (objectToVisit == null) {
       return;
     }
     objTypePair.setObject(objectToVisit);
     visitor.start(objTypePair);
     try {
       if (objTypeInfo.isArray()) {
         visitor.visitArray(objectToVisit, objTypePair.type);
       } else if (objTypeInfo.getActualType() == Object.class
           && isPrimitiveOrString(objectToVisit)) {
         // TODO(Joel): this is only used for deserialization of "primitives"
         // we should rethink this!!!
         visitor.visitPrimitive(objectToVisit);
         objectToVisit = visitor.getTarget();
       } else {
         visitor.startVisitingObject(objectToVisit);
         ObjectTypePair currObjTypePair = objTypePair.toMoreSpecificType();
         Class<?> topLevelClass = new TypeInfo(currObjTypePair.type).getRawClass();
         for (Class<?> curr = topLevelClass;
             curr != null && !curr.equals(Object.class);
             curr = curr.getSuperclass()) {
           if (!curr.isSynthetic()) {
             navigateClassFields(objectToVisit, curr, visitor);
           }
         }
       }
     } finally {
       visitor.end(objTypePair);
     }
   }
 }
 public boolean visitUsingCustomHandler(ObjectTypePair objTypePair) {
   try {
     Object obj = objTypePair.getObject();
     if (obj == null) {
       if (serializeNulls) {
         assignToRoot(JsonNull.createJsonNull());
       }
       return true;
     }
     JsonElement element = findAndInvokeCustomSerializer(objTypePair);
     if (element != null) {
       assignToRoot(element);
       return true;
     }
     return false;
   } catch (CircularReferenceException e) {
     throw e.createDetailedException(null);
   }
 }