2012-05-10 63 views
5

Tôi mới làm quen với JSON và muốn tạo đối tượng JSON đơn giản bằng cách sử dụng StringBuilder sẽ được truy vấn bằng một cuộc gọi jQuery Ajax.Cách tạo đối tượng JSON đơn giản bằng cách sử dụng Trình tạo chuỗi C#

[WebMethod] 
public static string GetmyJSON() 
{ 
    StringBuilder sb = new StringBuilder();  
    sb.Append("{firstname: \"Manas\",").Append("lastname : \"Tunga\"").Append("}"); 
    return sb.ToString();  

} 

Trong mã client-side của tôi có:

.ajax({ 

     type: "POST", 
     url: "simplePage.aspx/GetmyJSON",   
     data: "{}", 
     contentType: 'application/json; charset=utf-8', 
     dataType: 'json', 

     success: function (data) { 

      alert(data.d.firstname);    


     } // end of sucess 

    }); // End of ajax 

Nhưng thông điệp cảnh báo của tôi cho thấy 'undefined' thay vì 'Manas. Có thể trả về một đối tượng JSON bằng StringBuilder không?

+0

Bạn có thể xây dựng đối tượng .net thích hợp để gói gọn dữ liệu bạn muốn gửi lại và chuyển chúng vào JSON qua một số thư viện như JSON.Net.Nếu bạn muốn một số kỹ thuật trong xây dựng sau đó làm một số nghiên cứu với DataContractSerializer – deostroll

+0

Nếu bạn nhấn mạnh để làm cho nó theo cách này, ether thay đổi '\" 'thành' '', ether thay đổi nó thành' \\\ "' – Aristos

+1

tên thuộc tính JSON phải được trích dẫn, tức là: '{" id ": 10}' – canon

Trả lời

3
var lstMes = new List<Person>(); 

      System.Web.Script.Serialization.JavaScriptSerializer oSerializer = 
      new System.Web.Script.Serialization.JavaScriptSerializer(); 
       string sJSON = oSerializer.Serialize(lstMes); 
       return sJSON; 

không quên để thêm tham chiếu đến:

System.Web.Extensions.dll !! 
10

Never làm điều đó. Không bao giờ xây dựng JSON theo cách thủ công. Luôn luôn sử dụng trình nối tiếp JSON. Hoặc trong trường hợp của bạn, bạn thậm chí không cần phải làm điều đó vì thời gian chạy ASP.NET webmethod sẽ chăm sóc. Tất cả những gì bạn phải làm là tập trung vào các yêu cầu kinh doanh của bạn và đừng lo lắng về hệ thống ống nước.

Vì vậy, ví dụ bắt đầu bằng cách xác định một mô hình mà sẽ đại diện cho dữ liệu của bạn:

public class Person 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

và sau đó có phương pháp web của bạn trở lại mô hình này để lại tất cả các mối quan tâm serialization vào khuôn khổ:

[WebMethod] 
public static Person GetPerson() 
{ 
    Person p = new Person(); 
    p.FirstName = "Manas"; 
    p.LastName = "Tunga"; 
    return p; 
} 

Và bây giờ chỉ cần sử dụng phương thức này từ khách hàng:

$.ajax({ 
    type: 'POST', 
    url: 'simplePage.aspx/GetPerson', 
    data: '{ }', 
    contentType: 'application/json; charset=utf-8', 
    success: function (data) { 
     alert(data.d.FirstName); 
     alert(data.d.LastName); 
    } 
}); 

Không có nee d phải lo lắng về JSON, xây dựng chuỗi, ...

Và bạn cũng có thể vượt qua đối số phức tạp để phương pháp web của bạn nếu bạn cần:

public class Foo 
{ 
    public string Bar { get; set; } 
} 

và sau đó:

[WebMethod] 
public static Person GetPerson(Foo foo) 
{ 
    ... 
} 

và cuối cùng:

$.ajax({ 
    type: 'POST', 
    url: 'simplePage.aspx/GetPerson', 
    data: JSON.stringify({ foo: { bar: 'baz' } }), 
    contentType: 'application/json; charset=utf-8', 
    success: function (data) { 
     alert(data.d.FirstName); 
     alert(data.d.LastName); 
    } 
}); 

phương pháp JSON.stringify đưa ra ở đây là nguyên bản được xây dựng vào trình duyệt hiện đại S. Nếu bạn cần hỗ trợ các trình duyệt cũ, bạn có thể bao gồm tập lệnh json2.js vào trang của mình.

+0

Nếu tôi yêu cầu bạn sử dụng trình tạo chuỗi để tạo JSON theo cách thủ công thì bạn sẽ làm như thế nào. Tôi wana biết đâu là sai lầm của tôi – manas

+0

Bạn không thể khăng khăng điều gì sai trái khi xây dựng JSON bằng cách sử dụng chuỗi thủ công. Điều gì là sai là cách tiếp cận mà bạn đã thực hiện. Vấn đề là bạn đang trả về một chuỗi từ phương thức web của bạn. Vì vậy, bên trong trình xử lý thành công của bạn, bạn cần phải phân tích cú pháp chuỗi này trở lại đối tượng nếu bạn muốn truy cập nó, giống như 'alert ($. ParseJSON (data.d) .firstname);'. Nhưng làm ơn, xin hãy hứa với tôi bạn sẽ không bao giờ làm bất cứ điều gì như thế. –

+0

@DarinDimitrov, bạn đủ thẩm quyền để chỉ tin bạn và bác bỏ những lo ngại về hiệu suất của tôi, nhưng tôi vẫn tò mò tại sao nó lại xấu và tại sao không có lớp JsonBuilder gốc trong BCL tương tự như StringBuilder, XmlWriter, HtmlTextWriter. Tại sao tất cả những điều đó là OK, nhưng JsonBuilder là ác? Giả sử tôi cần tạo các đối tượng đơn giản gồm 5 thuộc tính, nhưng một số thuộc tính chỉ được xác định khi một số điều kiện được đáp ứng. Quá phức tạp để xác định thứ bậc mô hình cho trường hợp như vậy - tôi sẽ sử dụng từ điển động hoặc Từ điển. Nó sẽ làm tổn thương hiệu suất một chút ... –

0

Trả lời đúng câu hỏi - có bạn có thể trả lại bất kỳ điều gì bạn muốn từ phương thức .NET. Vấn đề của bạn, như @canon đã nói trong một bình luận về câu hỏi, có lẽ là bạn phải bọc các tên thuộc tính.

nào chứng tỏ tại sao câu trả lời "đúng" (như đã đề cập: 1, 2) là sử dụng một serializer hiện như JSON.NET (nếu bạn cần phải tự serialize) hoặc cho phép NET xử lý nó (giống như trong hầu hết " "lặp lại" gần đây bằng cách trả lại chính đối tượng.

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