Bỏ qua một trường trong quá trình tuần tự hóa .NET JSON; tương tự với [XmlIgnore]?


80

Tôi có một lớp POCO đang được gửi tới trình duyệt dưới dạng chuỗi JSON trong .NET 3.5 sp1. Tôi chỉ đang sử dụng tuần tự hóa JSON mặc định và tôi có một số trường mà tôi muốn bỏ qua. Tôi muốn đặt một thuộc tính tương tự như [System.Xml.Serialization.XmlIgnore] trên chúng để chúng không bị tuần tự hóa.

Câu trả lời:


121

Tôi sử dụng thuộc tính ScriptIgnore trên mô hình của mình như sau:

public class Item
{
    [ScriptIgnore]
    public Item ParentItem { get; set; }
}

Trong trường hợp cụ thể này, tôi đã gặp lỗi tham chiếu vòng từ bộ nối tiếp Json, vì vậy tôi chỉ đơn giản là bỏ qua nó. Tôi đã hỏi một câu hỏi tương tự ở đây trên SO khi tôi được bật về sự khác biệt giữa Model và ViewModel.


1
điều gì sẽ xảy ra nếu nó không phải là POCO mà là một EntityModel được tạo, tôi không muốn chỉnh sửa mã đã tạo, có giải pháp nào để thêm thuộc tính ScriptIgnore vào mô hình thực thể được tạo không.
hazimdikenli

@hazimdikenli, bạn có thể phải sử dụng một phần lớp cho việc này.
Anand

11
Đừng quên để thêm một tham chiếu đến "System.Web.Extensions" cho việc này đến công việc
Levitikon

1
Điều này đã giúp tôi ngăn việc toJson (Mô hình) của tôi đưa trở lại một số trường không mong muốn, nhưng lý tưởng nhất là với API, bạn sẽ cần tạo một Khu vực mới, với Mô hình mới và bộ điều khiển để tránh các chú thích chéo .. nhưng tôi quá lười. Cảm ơn +1
Piotr Kula

27
[ScriptIgnore] 

là huckaberry của bạn.


1
Nó thực sự là "Huckle Bearer", nhưng tôi sẽ cho bạn +1 cho nỗ lực và bộ phim. :)
Bryan Ray,

8
Câu trả lời ban đầu là đúng, anh ấy nói "huckleberry", không phải "huckle bearer". imsdb.com/scripts/Tombstone.html
heisenberg

5
... như trong "Huckleberry Finn" - ám chỉ "mọi người đàn ông" tinh túy, người luôn cố gắng "làm điều đúng" theo bản năng - một người bạn thực sự mà bạn luôn có thể tin tưởng ... do đó "Tôi là Huckleberry của bạn" , nghĩa là "bạn có thể tin tưởng vào tôi".
John Holliday

2

Bạn chỉ cần thêm [ScriptIgnore(ApplyToOverrides = true)]tệp vào mẫu văn bản (.tt) của mình.

Đây là một phần của mẫu văn bản của tôi trước đây

#>
<#=codeStringGenerator.NavigationProperty(navigationProperty)#>
<#

Khi tôi đã chèn mã vào dòng phía trên các codeStringGeneratorlớp của tôi được tạo tự động và trông như thế này:

[ScriptIgnore(ApplyToOverrides = true)]
public virtual ICollection<Currency> Currencies { get; set; }

Tôi cũng cần sửa đổi UsingDirectiveschức năng để chèn"using System.Web.Script.Serialization;"


ApplyToOverridesdường như rất quan trọng đối với một tài sản ảo
Todd

1

Đặt thuộc tính làm nội bộ. Tuy nhiên, phụ thuộc vào cấu trúc của bạn. Hãy cân nhắc.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.