Como Retornar Dados em Json com WebService .NET

O webservice .NET retorna as informações utilizando o protocolo SOAP e os dados em formato XML. Este artigo mostra como retornar os dados no formato JSON, utilizando um webservice na versão 3.5 do .NET Framework.

Para mostrar como retornar dados no formato JSON,  foi criado um webservice que retorna a relação de Estados do Brasil, juntamente com as informações de capital, área em km2 e abreviação de cada estado.

Para que o webservice retorne os dados em JSON é necessário inserir o atributo [System.Web.Script.Services.ScriptService] na classe do webservice (linha 4) e o atributo     [ScriptMethod(ResponseFormat=ResponseFormat.Json)] (linha 45) no método que vai retornar os dados, como demonstrado no código abaixo:

   1:  [WebService(Namespace = "http://tempuri.org/")]
   2:  [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
   3:  // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
   4:  [System.Web.Script.Services.ScriptService]
   5:  public class Service : System.Web.Services.WebService
   6:  {
   7:      private string[,] estados = new string[27, 4] 
   8:      {
   9:          {"Acre", "AC", "Rio Branco", "152581,4"},
  10:          {"Alagoas", "AL", "Maceió", "27767,7"},
  11:          {"Amapá", "AP", "Macapá", "142814,6"},
  12:          {"Amazonas", "AM", "Manaus", "1570745,7"},
  13:          {"Bahia", "BA", "Salvador", "564692,7"},
  14:          {"Ceará", "CE", "Fortaleza", "148825,6"},
  15:          {"Distrito Federal", "DF", "Brasília", "5822,1"},
  16:          {"Espírito Santo", "ES", "Vitória", "46077,5"},
  17:          {"Goiás", "GO", "Goiânia", "340086,7"},
  18:          {"Maranhão", "MA", "São Luís", "331983,3"},
  19:          {"Mato Grosso", "MT", "Cuiabá", "903357,9"},
  20:          {"Mato Grosso do Sul", "MS", "Campo Grande", "357125,0"},
  21:          {"Minas Gerais", "MG", "Belo Horizonte", "586528,3"},
  22:          {"Pará", "PA", "Belém", "1247689,5"},
  23:          {"Paraíba", "PB", "João Pessoa", "56439,8"},
  24:          {"Paraná", "PR", "Curitiba", "199314,9"},
  25:          {"Pernambuco", "PE", "Recife", "98311,6"},
  26:          {"Piauí", "PI", "Teresina", "251529,2"},
  27:          {"Rio de Janeiro", "RJ", "Rio de Janeiro", "43696,1"},
  28:          {"Rio Grande do Norte", "RN", "Natal", "52796,8"},
  29:          {"Rio Grande do Sul", "RS", "Porto Alegre", "281748,5"},
  30:          {"Rondônia", "RO", "Porto Velho", "237576,2"},
  31:          {"Roraima", "RR", "Boa Vista", "224299,0"},
  32:          {"Santa Catarina", "SC", "Florianópolis", "95346,2"},
  33:          {"São Paulo", "SP", "São Paulo", "248209,4"},
  34:          {"Sergipe", "SE", "Aracaju", "21910,3"},
  35:          {"Tocantins", "TO", "Palmas", "277620,9"}
  36:      };
  37:   
  38:      public Service () {
  39:   
  40:          //Uncomment the following line if using designed components 
  41:          //InitializeComponent(); 
  42:      }
  43:   
  44:      [WebMethod]
  45:      [ScriptMethod(ResponseFormat=ResponseFormat.Json)]
  46:      public string GetEstados() {
  47:          JavaScriptSerializer js = new JavaScriptSerializer();
  48:          
  49:          List<object> obj = new List<object>();
  50:   
  51:          for (int i = 0; i < estados.GetUpperBound(0); i++)
  52:          {
  53:              Estados estado = new Estados();
  54:              estado.Nome = estados[i, 0];
  55:              estado.Abreviacao = estados[i, 1];
  56:              estado.Capital = estados[i, 2];
  57:              estado.Area = estados[i, 3];
  58:   
  59:              obj.Add(estado);
  60:          }
  61:          
  62:          return js.Serialize(obj);
  63:      }
  64:   
  65:      private class Estados
  66:      {
  67:          public string Nome { get; set; }
  68:          public string Abreviacao { get; set; }
  69:          public string Capital { get; set; }
  70:          public string Area { get; set; }
  71:      }
  72:  }

No método GetEstados() foi utilizada a classe JavaScriptSerializer (linha 47) para criar um objeto que serializa no formato JSON, a lista de objetos Estados.
Na execução do webservice obtemos o seguinte retorno:
webservicejson1
Na figura podemos observar que os dados foram retornados em JSON, mas precisamos ter um cuidado no momento de utilizar o retorno deste webservice, porque mesmo o retorno dos dados estando no formato JSON o webservice na verdade retorna um XML com uma tag <string>, onde no valor da string são retornados os dados no formato JSON.

Para que aplicações possam utilizar os dados é necessário fazer a leitura somente da tag <string>. A aplicação que utilizar os dados deste webservice precisa ler o conteúdo da tag <string> para obter a informação em JSON.

Segue uma figura com os dados já formatados como Json.
webservicejson2