function serializeArray($result, $instance, $isSimpleResult, $serverKey)
{
    $json = "";
    if (is_array($result)) {
        if (ArrayUtils::isAssociative($result)) {
            $json .= "{";
            foreach ($result as $key => $value) {
                $json .= '"' . $key . '":';
                if (is_object($value)) {
                    $json .= serializeObject($value, $instance, false, $serverKey);
                } else {
                    if (is_array($value)) {
                        $json .= serializeArray($value, $instance, $isSimpleResult, $serverKey);
                    } else {
                        $json .= serializeObject($value, $instance, !is_object($value), $serverKey);
                    }
                }
                $json .= ",";
            }
        } else {
            $json .= "[";
            for ($i = 0; $i < count($result); $i++) {
                $json .= serializeObject($result[$i], $instance, $isSimpleResult, $serverKey) . ",";
            }
        }
        $json = JsonUtils::removeLastChar($result, $json);
        if (ArrayUtils::isAssociative($result)) {
            $json .= "}";
        } else {
            $json .= "]";
        }
    }
    return $json;
}
function serializeMethodResult($method, $result, $instance, $serverKey)
{
    $json = "";
    if (isNoResult($method)) {
        return "{}";
    }
    $isSimpleResult = isSimpleResult($method);
    if ($result === null) {
        if ($isSimpleResult) {
            $json .= '{"' . $method->getResult() . '":null}';
        } else {
            $json .= "{}";
        }
    } else {
        if ($isSimpleResult) {
            $json .= '{"' . $method->getResult() . '":';
        }
        if ($method->isArray()) {
            if (is_array($result)) {
                $json .= serializeArray($result, $instance, $isSimpleResult, $serverKey);
            } else {
                // The result it's not an array although it was described IT WAS an array
                throw new MashapeException(EXCEPTION_EXPECTED_ARRAY_RESULT_SIMPLE, EXCEPTION_GENERIC_LIBRARY_ERROR_CODE);
            }
        } else {
            if (is_array($result)) {
                // The result it's an array although it was described IT WAS NOT an array
                throw new MashapeException(EXCEPTION_UNEXPECTED_ARRAY_RESULT_SIMPLE, EXCEPTION_GENERIC_LIBRARY_ERROR_CODE);
            } else {
                $json .= serializeObject($result, $instance, $isSimpleResult, $serverKey);
            }
        }
        if ($isSimpleResult) {
            $json .= '}';
        }
    }
    return $json;
}
function serializeObject($result, $instance, $isSimpleResult, $serverKey)
{
    $json = "";
    if ($isSimpleResult) {
        // It's a simple result, just serialize it
        $json = JsonUtils::encodeToJson($result);
    } else {
        // It's a custom object, let's serialize recursively every field
        $className = get_class($result);
        $reflectedClass = new ReflectionClass($className);
        $xmlObject = RESTConfigurationLoader::getObject($className, $serverKey);
        if (empty($xmlObject)) {
            throw new MashapeException(sprintf(EXCEPTION_UNKNOWN_OBJECT, $className), EXCEPTION_GENERIC_LIBRARY_ERROR_CODE);
        }
        // Start element
        $json .= "{";
        // Serialize fields
        $fields = $xmlObject->getFields();
        for ($i = 0; $i < count($fields); $i++) {
            $field = $fields[$i];
            $fieldName = $field->getName();
            $fieldMethod = $field->getMethod();
            $fieldValue = null;
            if (empty($fieldMethod)) {
                if ($reflectedClass->hasProperty($fieldName)) {
                    $reflectedProperty = $reflectedClass->getProperty($fieldName);
                    if ($reflectedProperty->isPublic()) {
                        $fieldValue = $reflectedProperty->getValue($result);
                    } else {
                        // Try using the __get magic method
                        $fieldValue = $reflectedClass->getMethod("__get")->invokeArgs($result, array($fieldName));
                    }
                } else {
                    if (ArrayUtils::existKey($fieldName, get_object_vars($result))) {
                        $fieldValue = $result->{$fieldName};
                    } else {
                        throw new MashapeException(sprintf(EXCEPTION_FIELD_NOTFOUND, $fieldName), EXCEPTION_GENERIC_LIBRARY_ERROR_CODE);
                    }
                }
            } else {
                $fieldValue = $reflectedClass->getMethod($fieldMethod)->invoke($result);
            }
            if ($fieldValue === null && $field->isOptional()) {
                // Don't serialize the field
                continue;
            }
            $json .= '"' . $fieldName . '":';
            if ($fieldValue === null) {
                $json .= JsonUtils::encodeToJson($fieldValue);
            } else {
                $isSimpleField = isSimpleField($field);
                if ($field->isArray()) {
                    if (is_array($fieldValue)) {
                        $json .= serializeArray($fieldValue, $instance, isSimpleField($field), $serverKey);
                    } else {
                        // The result it's not an array although it was described IT WAS an array
                        throw new MashapeException(sprintf(EXCEPTION_EXPECTED_ARRAY_RESULT, $fieldName, $className), EXCEPTION_GENERIC_LIBRARY_ERROR_CODE);
                    }
                } else {
                    if (is_array($fieldValue)) {
                        // The result it's an array although it was described IT WAS NOT an array
                        throw new MashapeException(sprintf(EXCEPTION_UNEXPECTED_ARRAY_RESULT, $fieldName, $className), EXCEPTION_GENERIC_LIBRARY_ERROR_CODE);
                    } else {
                        $json .= serializeObject($fieldValue, $instance, $isSimpleField, $serverKey);
                    }
                }
            }
            $json .= ",";
        }
        if (substr($json, strlen($json) - 1, 1) != "{") {
            $json = JsonUtils::removeLastChar($fields, $json);
        }
        // Close element
        $json .= "}";
    }
    return $json;
}