2011-12-05 38 views
24

Tôi đang tạo chức năng tự động hoàn tất cho trang web của mình. Cho đến nay, phần javascript đã hết. Ngoài ra, tôi có thể lấy đối tượng MembershipUser của người dùng phù hợp.ASP.NET Trả lại JSON với ASHX

Tôi cần phải trả lại JSON trong các định dạng sau:

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

và đây là mã trong 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); 
     } 
    } 
} 

Làm thế nào tôi có thể trả lại json theo định dạng mong muốn? Cảm ơn.

+2

Đó không phải là JSON hợp lệ bằng cách này. Xem: http://json.org/ – ChaosPandion

+0

ChaosPandion, plugin yêu cầu đầu ra này ...:/ – user1027620

Trả lời

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

Tạo một lớp học có một hợp đồng dựa trên sự trở lại mà bạn muốn, và sau đó sử dụng JSONSerializer trên một thể hiện của lớp đó để tạo ra nội dung trở lại của bạn

[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

Xin chào, cảm ơn câu trả lời. Bạn có thể vui lòng giải thích một chút như thế nào điều này được thực hiện trong vòng lặp for? – user1027620

+2

Tôi sẽ bỏ phiếu nếu bạn có thể cung cấp thêm chi tiết @Tim – MacGyver

5

json của bạn là một chút vụng về kể từ khi bạn có để duy trì chỉ mục vào cả hai mảng đó. Tôi có thể đề nghị một cái gì đó giống như thế này?

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

Điều này giúp tôi:

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 sẽ được tìm thấy ở đây: http://json.codeplex.com/releases/

+2

Chỉ cần thêm, trong IE8 (chỉ?) Điều này sẽ thất bại khi được gọi. Một hộp thoại sẽ bật lên hỏi bạn có muốn mở hay lưu tệp "handler.ashx" không. Để giải quyết vấn đề này, hãy thay đổi dòng mã để trả về văn bản: ngữ cảnh.Response.ContentType = "text/html"; –

Các vấn đề liên quan