docs: public static String serializeFromField(final Object containingObject, final String fieldName,
              final int indentWidth, final boolean onlySerializePublicFields, final ClassFieldCache classFieldCache) {
          final FieldTypeInfo fieldResolvedTypeInfo = classFieldCache
                  .get(containingObject.getClass()).fieldNameToFieldTypeInfo.get(fieldName);
          if (fieldResolvedTypeInfo == null) {
              throw new IllegalArgumentException("Class " + containingObject.getClass().getName()
                      + " does not have a field named \"" + fieldName + "\"");
          }
          final Field field = fieldResolvedTypeInfo.field;
          if (!JSONUtils.fieldIsSerializable(field, /* onlySerializePublicFields = */ false)) {
              throw new IllegalArgumentException("Field " + containingObject.getClass().getName() + "." + fieldName
                      + " needs to be accessible, non-transient, and non-final");
          }
          Object fieldValue;
          try {
              fieldValue = JSONUtils.getFieldValue(containingObject, field);
          } catch (final IllegalAccessException e) {
              throw new IllegalArgumentException("Could get value of field " + fieldName, e);
          }
          return serializeObject(fieldValue, indentWidth, onlySerializePublicFields, classFieldCache);
      }