2013-08-29 46 views
6

CẬP NHẬT Tìm thấy vấn đề - được kế thừa từ lớp sai, cần phải là JsonConverter.serializer tùy chỉnh cho chỉ một thuộc tính trong Json.NET

Tôi có một lớp có thuộc tính Vị trí thuộc loại System.Data.Entity.Spatial.DbGeography. Các Json.NET serializer mặc định đặt ra JSON văn bản như thế này:

... 
    "PlaceType": 0, 
    "Location": { 
    "Geography": { 
     "CoordinateSystemId": 4326, 
     "WellKnownText": "POINT (-88.00000 44.00000)" 
    } 
    }, 
    "AddedDT": null, 
    ... 

Tôi muốn nó đưa ra văn bản như thế này:

... 
    "PlaceType": 0, 
    "Location": [-88.00000,44.00000], 
    "AddedDT": null, 
    ... 

... do đó, có vẻ như với tôi những gì tôi nên làm sẽ là ghi đè bất kỳ trình chuyển đổi nào hiện đang được sử dụng trên loại DbGeography. Các ví dụ tôi đã thấy cho đến nay sử dụng CustomCreationConverters và ContractResolvers dường như giải quyết cách bạn thay thế serializer cho lớp chính đang được tuần tự hóa, không phải cho một kiểu mà chỉ là một thuộc tính của lớp đó. Các ví dụ liên quan đến chú thích lớp bị ghi đè không làm việc cho tôi vì tôi không định nghĩa DbGeography trong mã của tôi và nó có hiệu quả là lớp được niêm phong bởi vì nó không có hàm tạo và chỉ có thể được khởi tạo bằng phương thức nhà máy internal.

Có cách nào để áp dụng JsonConverter cho một loại lưu loát không? Nếu vậy, công cụ chuyển đổi sẽ như thế nào? Tôi chỉ ghi đè lên phương thức WriteJson()?

Trả lời

4

Hóa ra tôi chỉ cần thừa hưởng từ JsonConverter thay vì CustomCreationConverter, và mọi thứ khác tôi đã cố gắng thay đổi là OK tất cả cùng.

Tôi vẫn không chắc chắn có cách nào để áp dụng JsonConverter lưu loát hay không, nhưng có một cách khác để áp dụng JsonConverter mà không tham chiếu Json.NET trong miền của bạn/dự án cốt lõi hoặc đánh dấu các lớp miền của bạn với tham chiếu đến thư viện ngoại vi:

var jsonSerializer = new JsonSerializer(); 
jsonSerializer.Converters.Add(new DbGeographyConverter()); 
jsonSerializer.Serialize(jsonWriter, place); 
+1

OK, tôi phải đợi hai ngày để đánh dấu câu hỏi của mình là đã trả lời? Vì vậy, một nhóm người sẽ phải nhìn vào điều này như thể tôi vẫn đang chờ đợi một câu trả lời? Tempted để xóa toàn bộ điều. –

+1

Tốt hơn là nên rời khỏi đó-- những người khác có thể hưởng lợi từ những gì bạn đã học được. Bạn đã làm đúng, cập nhật câu hỏi để nói rằng nó được giải quyết trong thời gian tạm thời. –

4

Sử dụng JsonConverterAttribute về tài sản và xác định một tùy chỉnh Converter

ví dụ, chúng tôi có một tài sản mà đi theo như một giá trị unix (int dài) và chúng tôi serialize nó vào một Net DateTime:

[JsonConverter(typeof(UnixTimeJsonConverter))] 
public DateTime Requested { get; set; } 
+0

Bạn có thể cung cấp thêm thông tin về cách tất cả được kết nối với nhau không? Tôi đã chụp hai bức ảnh tốt nhất của tôi ở đây và nó không có hiệu lực. Tôi sẽ cập nhật câu hỏi của mình với nhiều thông tin hơn. –

9

bạn có thể thêm một serializer tùy chỉnh để một thuộc tính đơn như thế này:

public class Comment 
{ 
    public string Author { get; set; } 

    [JsonConverter(typeof(NiceDateConverter))] 
    public DateTime Date { get; set; } 

    public string Text { get; set; } 
} 

public class NiceDateConverter : JsonConverter 
{ 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     var date = value as DateTime; 
     var niceLookingDate = date.ToString("MMMM dd, yyyy 'at' H:mm tt"); 
     writer.WriteValue(niceLookingDate); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     throw new NotImplementedException("Unnecessary because CanRead is false. The type will skip the converter."); 
    } 

    public override bool CanRead 
    { 
     get { return false; } 
    } 

    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(DateTime); 
    } 
} 

Sau đó, khi bạn serialize đối tượng của bạn với JsonConvert.SerializeObject(), serializer tùy chỉnh sẽ được sử dụng cho ngày thích hợp y.

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