2015-12-03 11 views
17

मैं json.net (न्यूटनसॉफ्ट के जेसनसेरियलाइज़र) का उपयोग कर रहा हूं। मुझे निम्नलिखित आवश्यकताओं को पूरा करने के लिए क्रमबद्धता को अनुकूलित करने की आवश्यकता है:न्यूटॉन्सॉफ्ट जेसनसेरियलाइज़र - लोअर केस गुण और शब्दकोश

  1. संपत्ति नाम कम केस अक्षर से शुरू होना चाहिए।
  2. शब्दकोश jsonp में क्रमबद्ध होना चाहिए जहां कुंजी नाम संपत्ति के नामों के लिए उपयोग किया जाएगा। लोअरकेस नियम शब्दकोश कुंजी के लिए लागू नहीं होता है।

    var product = new Product(); 
    procuct.Name = "Product1"; 
    product.Items = new Dictionary<string, Item>(); 
    product.Items.Add("Item1", new Item { Description="Lorem Ipsum" }); 
    

    में क्रमानुसार चाहिए::

उदाहरण के लिए

{ 
    name: "Product1", 
    items : { 
    "Item1": { 
     description : "Lorem Ipsum" 
    } 
    } 
} 

सूचना है कि संपत्ति का नाम "नाम" में धारावाहिक करता है, लेकिन कुंजी आइटम 1 "आइटम 1" में धारावाहिक करता है;

मैंने कस्टम नामों को क्रमबद्ध करने के लिए कस्टमजेसनवाइटर बनाने की कोशिश की है, लेकिन यह डिकोनरी कुंजी भी बदलती है।

public class CustomJsonWriter : JsonTextWriter 
{ 
    public CustomJsonWriter(TextWriter writer) : base(writer) 
    { 

    } 
    public override void WritePropertyName(string name, bool escape) 
    { 
     if (name != "$type") 
     { 
      name = name.ToCamelCase(); 
     } 
     base.WritePropertyName(name, escape); 
    } 
} 

उत्तर

9

आप एक जेसनप्रोपर्टी का उपयोग कर सकते हैं ताकि कुछ क्रमबद्ध/deserialized कैसे बदल सके। जब आप अपनी ऑब्जेक्ट को परिभाषित करते हैं तो उन संपत्तियों को संपत्ति आइटम जोड़ें जिन्हें आप JSON में अलग-अलग प्रतिनिधित्व करना चाहते हैं। यह केवल न्यूटॉन्सॉफ्ट जेसन के साथ काम करता है। अन्य पुस्तकालय इसे अलग-अलग कर सकते हैं।

public class Product 
{ 
    [JsonProperty("name")] 
    public string Name { get; set; } 

    [JsonProperty("items")] 
    public Dictionary<string, Item> Items { get; set; } 
} 

public class Item 
{ 
    [JsonProperty("description")] 
    public string Description { get; set; } 
} 
+5

यह उल्लंघन नहीं है। यह एक मैपिंग प्रदान करता है जो डेटा क्रमबद्धता से निपटने के दौरान आवश्यक हो सकता है। यह सी # परिवर्तनीय नामों और अंतर्निहित धारावाहिक प्रारूप के बीच मेल नहीं खा रहा है - जेएसओएन तक ही सीमित नहीं है। – Metro

+1

अच्छी तरह से, यदि कोई नियम या सम्मेलन है जिसका उपयोग मैपिंग निर्धारित करने के लिए किया जा सकता है, तो यह DRY – Liero

+0

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

37

आप CamelCasePropertyNamesContractResolver का उपयोग करने का प्रयास कर सकते हैं।

var serializerSettings = new JsonSerializerSettings(); 
serializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); 
var json = JsonConvert.SerializeObject(product, serializerSettings); 

मुझे यकीन नहीं है कि यह शब्दकोश कुंजी को कैसे संभालेगा और मेरे पास यह कोशिश करने के लिए इस समय सही नहीं है। यदि यह चाबियाँ सही ढंग से संभाल नहीं पाता है तो यह आपके स्वयं के कस्टम JSON लेखक लिखने के बजाय भविष्य के लिए ध्यान में रखना उचित है।

+0

का उल्लंघन इस विकल्प से सावधान रहें। यह विकल्प धारावाहिक शब्दकोशों की लोअरकेसिंग कुंजियों का भी कारण बनता है। यह आमतौर पर वांछित नहीं है। – user1936595

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