web-dev-qa-db-fra.com

ASP.NET renvoyant JSON avec ASHX

Je crée une fonctionnalité de saisie semi-automatique pour mon site Web. Jusqu'à présent, la partie javascript est terminée. En outre, je peux obtenir l'objet MembershipUser de l'utilisateur qui correspond.

Je dois retourner JSON dans le format suivant:

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

et voici le code 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);
        }
    }
}

Comment puis-je retourner le json dans le format souhaité? Merci.

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

Cela m'aide:

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 trouve ici: http://json.codeplex.com/releases/

19
BigMan

Créez une classe qui a un contrat basé sur le retour souhaité, puis utilisez le JSONSerializer sur une instance de cette classe pour créer votre contenu de retour

[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;} 
}
5
Tim Hoolihan

votre json est un peu gênant car vous devez maintenir un index dans ces deux tableaux. puis-je suggérer quelque chose de plus comme ça?

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