Por padrão não é possível retornar tipos complexos de dados a partir de uma chamada Ajax com o ASP.NET AJAX, porém é possível retornar DataSets, DataTables e DataRows utilizando uma biblioteca disponibilizada pela Microsoft em 2007, as funcionalidades desta biblioteca seriam implementadas no ASP.NET mas até agora isso não aconteceu. (não pesquisei ainda para saber se está presente no .NET Framework 4)
1. Baixe e instale o Microsoft ASP.NET Futures (July 2007).
2. Adicione ao projeto a DLL Microsoft.Web.Preview.dll que será disponibilizada na pasta da aplicação instalada.
3.Adicione as seguintes linhas ao Web.Config da aplicação:
<jsonSerialization>
<converters>
<add name="DataSetConverter"
type="Microsoft.Web.Preview.Script.Serialization.Converters.DataSetConverter,
Microsoft.Web.Preview"/>
<add name="DataRowConverter"
type="Microsoft.Web.Preview.Script.Serialization.Converters.DataRowConverter,
Microsoft.Web.Preview"/>
<add name="DataTableConverter"
type="Microsoft.Web.Preview.Script.Serialization.Converters.DataTableConverter,
Microsoft.Web.Preview"/>
</converters>
</jsonSerialization>
4. A partir dai você recebe no JavaScript uma estrutura muito parecida com a estrutura que você tem no ServerSide:
// Chamada para um PageMethod
function makeAjaxCall (){
PageMethods.AjaxCall(makeAjaxCall_cb);
}
// Método retorna um DataSet neste exemplo
function makeAjaxCall_cb(result){
alert(result.tables[0].rows[0].ID);
alert(result.tables[0].rows[0].Name);
}