2013-08-29 11 views
6

अद्यतन मिले मुद्दा - गलत वर्ग से इनहेरिट किया गया था, की जरूरत JsonConverter किया जाना है।कस्टम serializer

मेरे पास एक कक्षा है जिसमें सिस्टम की एक स्थान संपत्ति है। डेटा। एंटीटी .patial.DbGeography। डिफ़ॉल्ट Json.NET serializer इस तरह JSON टेक्स्ट डालता है:

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

मैं इसे इस तरह पाठ बाहर रखना चाहते हैं:

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

... इसलिए यह मेरे लिए मुझे क्या करना चाहिए लगता होगा वर्तमान में डीबीजीोग्राफी प्रकार पर जो कनवर्टर इस्तेमाल किया जा रहा है उसे ओवरराइड करना होगा।

उदाहरणों को मैंने अब तक देखा है कि कस्टमक्रिएशन कनवर्टर्स और कॉन्ट्रैक्ट रिसेल्वर का उपयोग यह पता चलता है कि आप धारावाहिक को मुख्य श्रेणी के लिए क्रमबद्ध करने के लिए कैसे क्रमबद्ध करेंगे, न कि उस वर्ग की केवल एक संपत्ति है। जिन उदाहरणों में ओवरराइड किया जा रहा है, उन्हें एनोटेट करने वाले उदाहरण मेरे लिए काम नहीं करते हैं क्योंकि मैं अपने कोड में डीबीजीग्राफी को परिभाषित नहीं करता हूं और यह प्रभावी रूप से एक सीलबंद वर्ग है क्योंकि इसमें कोई कन्स्ट्रक्टर नहीं है और केवल internal फैक्ट्री विधियों द्वारा इसे तुरंत चालू किया जा सकता है।

क्या एक प्रकार के लिए जेसन कनवर्टर को लागू करने का कोई तरीका है? यदि हां, कनवर्टर कैसा दिखता है? क्या मैं सिर्फ WriteJson() विधि को ओवरराइड करता हूं?

उत्तर

4

बाहर निकलता है मुझे कस्टमक्रिएशन कनवर्टर की बजाय जेसन कनवर्टर से उत्तराधिकारी होने की आवश्यकता है, और बाकी सब कुछ जिसे मैं बदलने की कोशिश कर रहा था ठीक था।

मुझे अभी भी यकीन नहीं है कि जेसन कनवर्टर को धीरे-धीरे लागू करने का कोई तरीका है या नहीं, लेकिन JsonConverter को अपने डोमेन/कोर प्रोजेक्ट में जेसन.NET का संदर्भ दिए बिना या अपने डोमेन क्लास को संदर्भ के साथ चिह्नित करने का एक और तरीका है परिधीय पुस्तकालय:

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

ठीक है, मुझे जवाब के रूप में अपने प्रश्न को चिह्नित करने के लिए दो दिन इंतजार करना है? तो लोगों का एक गुच्छा इसे देखना होगा जैसे कि मैं अभी भी जवाब का इंतजार कर रहा था? पूरी चीज को हटाने के लिए प्रेरित किया। –

+1

इसे वहां छोड़ना बेहतर है - दूसरों को जो आपने सीखा है उससे लाभ हो सकता है। आपने यह सही कहने के लिए सवाल उठाया कि यह अंतरिम में हल हो गया है। –

4

उपयोग संपत्ति पर JsonConverterAttribute और कनवर्टर

उदाहरण के लिए, हम एक संपत्ति है कि एक यूनिक्स मूल्य (लंबी पूर्णांक) के रूप में में आता है एक कस्टम परिभाषित करने और हम एक नेट DateTime करने के लिए इसे क्रमानुसार:

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

क्या आप इस बारे में अधिक जानकारी दे सकते हैं कि यह सब कैसे एक साथ वायर्ड है? मैंने इस पर अपना सर्वश्रेष्ठ दो शॉट लिया और इसका कोई प्रभाव नहीं पड़ा। मैं अधिक जानकारी के साथ अपना प्रश्न अपडेट करूंगा। –

9

आप इस प्रकार का एक विशेषता के लिए एक कस्टम serializer जोड़ सकते हैं:

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); 
    } 
} 

फिर, जब आप JsonConvert.SerializeObject() के साथ अपने वस्तु को क्रमानुसार, कस्टम serializer उपयोग किया जाएगा तिथि संपत्ति के लिए y।

संबंधित मुद्दे