2012-08-17 27 views
6

Tôi đang cố gắng sắp xếp các đối tượng dưới dạng JSON với MVC4 WebAPI (RTM - vừa cài đặt RT201 VS2012 hôm nay nhưng gặp vấn đề này ngày hôm qua trong RC) và tôi muốn tất cả các giá trị null được trả về trong đầu ra JSON. Như thế này:Không thể tạo MVC4 WebApi bao gồm các trường rỗng trong JSON

[{"Id": 1, "PropertyThatMightBeNull": null},{"Id":2, "PropertyThatMightBeNull": null}] 

Nhưng những gì Im nhận là

[{"Id":1},{"Id":2}] 

tôi đã tìm thấy Q này/A WebApi doesnt serialize null fields nhưng câu trả lời hoặc không làm việc cho tôi hay tôi đang thất bại trong việc nắm bắt nơi để đặt câu trả lời.

Đây là những gì tôi đã cố gắng:

  1. Trong Application_Start Global.asax.cs, tôi nói thêm:

    var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; 
    json.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Include; 
    json.SerializerSettings.DefaultValueHandling = Newtonsoft.Json.DefaultValueHandling.Include; 
    

    này không (dường như) lỗi và dường như thực sự thực hiện dựa trên việc xem xét điều tiếp theo tôi đã thử.

  2. Trong một phương pháp điều khiển (trong một lớp con của ApiController), nói thêm:

    base.Configuration.Formatters.JsonFormatter.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Include; 
    base.Configuration.Formatters.JsonFormatter.SerializerSettings.DefaultValueHandling = Newtonsoft.Json.DefaultValueHandling.Include; 
    

    tôi nói # 1 thực hiện bởi vì cả hai giá trị trong # 2 đã được thiết lập trước khi những dòng chạy như tôi bước qua.

  3. Trong một động thái tuyệt vọng (bởi vì tôi thực sự không muốn để trang trí tất cả các tài sản của mọi đối tượng) Tôi đã thử thêm attrib này cho một người sở hữu đó là vô vắng mặt:

    [JsonProperty(DefaultValueHandling = DefaultValueHandling.Include, 
        NullValueHandling = NullValueHandling.Include)] 
    

Tất cả ba sản xuất cùng một JSON với các thuộc tính rỗng được bỏ qua.

Ghi chú thêm:

  • Chạy tại địa phương trong IIS (cố gắng xây dựng trong quá), Windows 7, VS2012 RTM.
  • Phương thức điều khiển trả về Danh sách - đã thử IEnumerable quá
  • Các đối tượng mà tôi đang cố gắng sắp xếp là pocos.

Trả lời

1

Cuối cùng tôi đi qua http://forums.asp.net/t/1824580.aspx/1?Serializing+to+JSON+Nullable+Date+gets+ommitted+using+Json+NET+and+Web+API+despite+specifying+NullValueHandling này trong đó mô tả những gì tôi đã trải qua như một lỗi trong các phiên bản beta đó là cố định cho RTM.

Mặc dù tôi đã cài đặt RT201 VS2012, dự án của tôi vẫn đang sử dụng tất cả các gói nuget mà phiên bản beta đi kèm. Vì vậy, tôi nugetted (nugot?) Cập Nhật cho tất cả mọi thứ và tất cả bây giờ là tốt (sử dụng # 1 từ câu hỏi của tôi). Mặc dù tôi cảm thấy ngớ ngẩn vì đã bị đốt nửa ngày.

10

này sẽ không làm việc:

var json = GlobalConfiguration.Configuration.Formatters.JsonFormatter; 
json.SerializerSettings.NullValueHandling = Newtonsoft.Json.NullValueHandling.Include; 

Nhưng điều này không:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings = new Newtonsoft.Json.JsonSerializerSettings() 
{ 
NullValueHandling = Newtonsoft.Json.NullValueHandling.Include 
}; 
+0

Hóa ra nó đã làm việc - hoặc nên có. Tôi sẽ đăng những gì tôi đã được screwing lên để cung cấp cho bản thân mình một liều đầy đủ của humility :) – AndrewFreese

+0

Không thể cảm ơn đủ cho câu trả lời này. – Simian

+0

Biến thể đầu tiên cũng hoạt động (không cần tạo một phiên bản mới của các cài đặt serializer), miễn là bạn đặt cả hai giá trị mặc định là – Masterfu

0

Khi tôi thấy câu trả lời này, tôi đã rất buồn vì tôi đã làm điều này nhưng vấn đề của tôi vẫn tồn tại.Vấn đề của tôi bắt nguồn từ thực tế là đối tượng của tôi đã triển khai một giao diện bao gồm một kiểu nullable, vì vậy, tôi đã có một hợp đồng cho biết nếu bạn muốn thực hiện tôi, bạn phải có một trong số đó và một serializer nói rằng nếu một trong số đó là null không bao gồm nó. BOOM!

2

Vì một số lý do kỳ lạ, Newtonsoft.Json.JsonFormatter bỏ qua các xác nhận đối với propreties os SerializerSettings.

Để thực hiện việc thiết lập của bạn tạo thể hiện mới của .SerializerSettings như hình dưới đây:

config.Formatters.JsonFormatter.SerializerSettings = new Newtonsoft.Json.JsonSerializerSettings 
     { 

      DefaultValueHandling = Newtonsoft.Json.DefaultValueHandling.Include, 
      NullValueHandling = Newtonsoft.Json.NullValueHandling.Include, 

     }; 
+0

Điều này cũng hoạt động mà không cần tạo một phiên bản mới DefaultValueHandling và NullValueHandling với giá trị Bao gồm tương ứng – Masterfu

+0

Việc khởi tạo một phiên bản mới của các cài đặt bộ nối tiếp được yêu cầu để giải quyết vấn đề này cho chúng ta trên các máy phát triển và dàn dựng. Đây là một vấn đề khó chịu vì các máy phát triển của chúng tôi đã hoạt động như mong đợi bằng cách đơn giản thiết lập các giá trị tương ứng (với các phiên bản nối tiếp .NET.) –

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