2011-12-05 11 views
24

Estoy creando funciones de autocompletar para mi sitio web. Hasta ahora, la parte javascript ha terminado. Además, puedo obtener el objeto MembershipUser del usuario que coincida.ASP.NET Returning JSON con ASHX

que necesito para volver JSON en el siguiente formato:

{ 
query:'Li', 
suggestions:['Liberia','Libyan Arab Jamahiriya','Liechtenstein','Lithuania'], 
data:['LR','LY','LI','LT'] 
} 

y este es el código en ashx:

public void ProcessRequest (HttpContext context) { 
    System.Web.Script.Serialization.JavaScriptSerializer JsonSerializer; 
    string query = context.Request.QueryString["query"]; 
    System.Web.Security.MembershipUserCollection Users = System.Web.Security.Membership.GetAllUsers(); 
    context.Response.ContentType = "application/json"; 
    foreach (System.Web.Security.MembershipUser User in Users) 
    { 
     if (User.UserName.StartsWith(query.ToLower())) 
     { 
      context.Response.Write(query + Environment.NewLine); 
      context.Response.Write(User.Email); 
     } 
    } 
} 

¿Cómo puedo devolver el JSON en el formato deseado? Gracias.

+2

Eso no es JSON válida por cierto. Ver: http://json.org/ – ChaosPandion

+0

ChaosPandion, el complemento requiere esta salida ...:/ – user1027620

Respuesta

29
context.Response.Write(
    jsonSerializer.Serialize(
     new 
     { 
      query = "Li", 
      suggestions = new[] { "Liberia", "Libyan Arab Jamahiriya", "Liechtenstein", "Lithuania" }, 
      data = new[] { "LR", "LY", "LI", "LT" } 
     } 
    ) 
); 
5

Crear una clase que tiene un contrato basado en el rendimiento que desea y, a continuación, utilizar el JSONSerializer en una instancia de esa clase para crear el contenido de retorno

[DataContract] 
public class YourReturnObject { 
    [DataMember(Name="query")] 
    public String Query { get;set;} 

    [DataMember(Name="suggestions")] 
    public String[] Suggestions { get;set;} 

    [DataMember(Name="data")] 
    public String[] OtherData{ get;set;} 
} 
+2

Hola, gracias por la respuesta. ¿Podría explicarnos cómo se implementa esto en el ciclo for? – user1027620

+2

Voy a votar si puedes dar más detalles @Tim – MacGyver

5

su JSON es un poco incómodo ya que tienes para mantener un índice en ambas de esas matrices. ¿Podría sugerir algo más como esto?

{ 
query: 'Li', 
data: [{id:'LR', text:'Liberia'}, {id:'LY', text:'Libyan Arab Jamahiriya'}, ...] 
} 
16

Esto me ayuda:

using System; 
using System.Data; 
using System.Web; 
using System.Linq; 
using System.Collections; 
using Newtonsoft.Json; 

public class Handler : IHttpHandler { 

public void ProcessRequest (HttpContext context) { 
    context.Response.ContentType = "application/json"; 
    string quer = context.Request["query"]; 

    DataTable _t = AMC.Core.Logic.Root.Storage.ExecuteQuery("SELECT [tag_name] FROM [tags] Where [tag_name] like '%' + @ke + '%'", new System.Data.SqlClient.SqlParameter("ke", quer)); 

    DataRow[] list = new DataRow[_t.Rows.Count]; 
    _t.Rows.CopyTo(list, 0); 

    var wapper = new { 
     query = quer 
     , suggestions = (from row in list select row["tag_name"].ToString()).ToArray() 
     //, data = new[] { "LR", "LY", "LI", "LT" } 
    }; 
    context.Response.Write(JsonConvert.SerializeObject(wapper));    
} 

Newtonsoft.Json se puede encontrar aquí: http://json.codeplex.com/releases/

+2

Solo para agregar, en IE8 (¿solo?), Esto fallará cuando se llame. Aparecerá un cuadro de diálogo que le preguntará si desea abrir o guardar el archivo "handler.ashx". Para resolver esto, cambie la línea de código para devolver el texto: context.Response.ContentType = "text/html"; –

Cuestiones relacionadas