2012-03-15 41 views
5

Tôi đã bắt đầu sử dụng json.net để sản xuất DateTimes tốt hơn, nhưng tôi đã nhận thấy rằng một trong các thuộc tính của tôi không được đăng. Nó không có setter, và getter của nó phụ thuộc vào một thành viên khác của đối tượng, ví dụ:Json.net getter tài sản không serialized

public int AmountInPence { get; set;} 
public decimal AmountInPounds { get { return (decimal)AmountInPence/100; } } 

Tôi đã thực hiện một lớp kế thừa từ JsonResult và dòng chính là:

string serializedObject = JsonConvert.SerializeObject(Data, new IsoDateTimeConverter()); 

bất cứ ai có thể cho tôi biết làm thế nào để buộc nó để serialize tài sản đó?

Chỉnh sửa: Chỉ cần làm rõ - đó là một ví dụ đơn giản. Tôi đã cập nhật nó để phản ánh rằng tôi đang truyền int sang thập phân đầu tiên. Tôi đã quên kiểm tra trước đó, nhưng tài sản là một phần của một phần lớp, bởi vì nó đang được trả lại từ một dịch vụ WCF. Tôi tuyên bố rằng tài sản trong hội đồng của tôi, vì vậy đây có thể là một đầu mối?

Trả lời

15

Không có gì sai với Json là. mạng lưới. Nó có thể tuần tự hóa các thuộc tính chỉ đọc tốt. Vấn đề là ở bạn AmountInPounds

public decimal AmountInPounds { get { return AmountInPence/100; } } 

Bởi vì bạn đang làm phân chia số nguyên với / 100 nó có nghĩa là bạn sẽ nhận được 0 nếu AmountInPence là ít hơn 100.

Những gì bạn cần là sử dụng m suffix để đánh dấu 100 như decimal:

public decimal AmountInPounds { get { return AmountInPence/100m; } } 

để nhận được kết quả phù hợp trong AmountInPounds.

EDIT sau khi nhận xét:

Các tính sở hữu AmountInPoundstrong một lớp học phần của một dịch vụ WCF của tạo DataContract.

Và trong DataContract nếu thuộc tính không được đánh dấu bằng DataMemberAttribute có vẻ như nó sẽ không được đăng.

Vì vậy, bên cạnh câu trả lời của OP:

[JsonPropertyAttribute(DefaultValueHandling = DefaultValueHandling.Include)] 
public decimal AmountInPounds { get { return (decimal)AmountInPence/100; } } 

Đây cũng là hoạt động:

[System.Runtime.Serialization.DataMemberAttribute()] 
public decimal AmountInPounds { get { return (decimal)AmountInPence/100; } } 
+0

Cảm ơn bạn đã trả lời. Tôi không nghĩ rằng đó là vì điều đó mặc dù (tôi đã chỉnh sửa câu hỏi của tôi) – NickL

+0

Ok, sau đó bạn nên cung cấp bối cảnh nhiều hơn nữa. 'Dữ liệu' là những gì bạn đang cố gắng sắp xếp theo thứ tự? Đầu ra là gì? Bởi vì như @StriplingWarrior cũng chỉ ra: JsonConvert serializes 'AmountInPounds' ... – nemesv

+0

Dữ liệu là một đối tượng - một tài sản của JsonResult. Nó sẽ phải được đúc đầu tiên? – NickL

2

Điều này sẽ phù hợp với bạn. Các chương trình sau trong LINQPad hoạt động tốt:

void Main() 
{ 
    JsonConvert.SerializeObject(new A(), new IsoDateTimeConverter()).Dump(); 
} 

public class A 
{ 
    public int AmountInPence { get; set;} 
    public decimal AmountInPounds { get { return AmountInPence/100; } } 
} 

Output:

{ "AmountInPence": 0, "AmountInPounds": 0,0}

1

OK trông giống như tôi đã tìm thấy câu trả lời, xin lỗi vì đã không cung cấp thêm chi tiết trong bài viết, nhưng Tôi không nghĩ rằng nó quan trọng cuối cùng.

tôi cần phải thêm một thuộc tính trên tài sản AmountInPounds:

[JsonPropertyAttribute(DefaultValueHandling = DefaultValueHandling.Include)] 
public decimal AmountInPounds { get { return (decimal)AmountInPence/100; } } 
+0

Tôi rất vui vì bạn đã tìm thấy một giải pháp, nhưng nó vẫn còn rất lạ. Bởi vì tôi đã không thể tái tạo vấn đề của bạn không phải với các lớp một phần hoặc thừa kế hoặc với các thuộc tính không có giá trị. 'Newtonsoft.Json phiên bản 4.0.8' luôn luôn bao gồm các thuộc tính chỉ đọc ... – nemesv

+0

Có, tôi tạo ra một giải pháp riêng biệt sao chép tất cả mọi thứ ngoài các lớp học được tạo ra bởi dịch vụ WCF và nó làm việc như mong đợi. Có lẽ có một thuộc tính trên lớp đó ngăn Json.Net tự động tuần tự hóa các thuộc tính chỉ đọc này. Cảm ơn vì đã dành thời gian cho tôi! – NickL

+0

Có vẻ như 'DataMemberAttribute' cũng giải quyết được vấn đề của bạn, tôi không biết tại sao có thể đây là lỗi trong Json.net. Tuy nhiên tôi cũng đã cập nhật câu trả lời của tôi với thông tin này. – nemesv

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