2013-12-16 10 views
9

मैं कुछ सी # ASP.Net MVC है, जो कुछ DTOs क्रमानुसार करने Json.Net का इस्तेमाल कर रही है का उपयोग कर कोड है। आदेश पेलोड कम करने के लिए, मैं [JsonProperty (PropertyName = "SHORTNAME")] का इस्तेमाल किया है क्रमबद्धता के दौरान कम संपत्ति नामों का उपयोग करने जोड़कर देखते हैं।जेसनप्रॉपर्टी (PropertyName = "someName") को अनदेखा करते समय जेसन को क्रमबद्ध करते समय?

क्लाइंट एक और .NET ऐप या सेवा है, जब यह वास्तविक काम करता है, क्योंकि deserialization ऑब्जेक्ट पदानुक्रम को एक साथ वापस रखता है, और अधिक अनुकूल नामों का उपयोग करके, वास्तविक हस्तांतरण पेलोड को कम रखते हुए।

समस्या खेलने में आता है जब ग्राहक एक ब्राउज़र के माध्यम जावास्क्रिप्ट/ajax है। यह अनुरोध करता है, और जेसन मिल जाता है ... लेकिन वह जेसन कम कम दोस्ताना नामों का उपयोग कर रहा है।

मैं कैसे json.net क्रमबद्धता इंजन [JsonProperty (PropertyName = "SHORTNAME")] प्रोग्राम के रूप में विशेषता की अनदेखी कर सकते हैं? आदर्श रूप में, मेरी एमवीसी सेवा वहां चलने जा रही है और सामान्य रूप से संक्षिप्त संपत्ति नामों का उपयोग करके क्रमबद्ध करने जा रही है। जब मेरा कोड किसी विशेष पैरामीटर का पता लगाता है, तो मैं लंबे नामों का उपयोग करके डेटा को क्रमबद्ध करना चाहता हूं और [जेसनप्रोपर्टी()] विशेषता को अनदेखा करता हूं।

कोई सुझाव?

धन्यवाद,

केविन

+0

सिर्फ 'JsonProperty' हटाने और अनुसार एक गुमनाम ऑब्जेक्ट प्रदान आपके द्वारा पारित पैरामीटर के लिए। जैसे 'नई {username = uname} कुछ' –

+0

मुझे लगता है कि सबसे अच्छा तरीका एक कस्टम serializer (खरोंच से नहीं json.NET साथ,) बनाने और एनोटेशन बाहर निकालना होगा। छोटे नाम बनाम लंबे नामों को धारावाहिक की सेटिंग का नाम दें और केवल यह बताएं कि आप क्रमबद्धता के समय क्या चाहते हैं। json.NET को रन टाइम पर एनोटेशन का उपयोग/अनदेखा करने के लिए कोई समर्थन नहीं है। यदि वे संकलन समय पर हैं, तो उनका उपयोग किया जाएगा (कुछ प्रमुख हैकिंग को रोकना)। – evanmcdonnal

+0

मैं वहां टिप्पणियों की सराहना करता हूं। @evanmcdonnal: अगर हम एक कस्टम धारावाहिक के साथ गए, तो क्या हमें इसे डीटीओ-विशिष्ट स्तर (प्रत्येक डीटीओ से जुड़ा हुआ) पर करने की ज़रूरत होगी? हमारे पास कई विकास टीमों के माध्यम से कई समाधानों में फैले कई डीटीओ हैं। आदर्श रूप से हम बोर्ड के पार सभी डीटीओ के माध्यम से इसे छूने और बनाए रखने के बिना धारावाहिक प्रक्रिया में संलग्न करने के लिए अपेक्षाकृत सुरुचिपूर्ण तरीका पा सकते हैं। – Kevin

उत्तर

23

यह सुंदर आसानी से किया जा सकता है एक कस्टम अनुबंध समाधानकर्ता का उपयोग कर। यहाँ सब कोड है आप की आवश्यकता होगी:

class LongNameContractResolver : DefaultContractResolver 
{ 
    protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) 
    { 
     // Let the base class create all the JsonProperties 
     // using the short names 
     IList<JsonProperty> list = base.CreateProperties(type, memberSerialization); 

     // Now inspect each property and replace the 
     // short name with the real property name 
     foreach (JsonProperty prop in list) 
     { 
      prop.PropertyName = prop.UnderlyingName; 
     } 

     return list; 
    } 
} 

यहाँ समाधानकर्ता का उपयोग कर एक त्वरित प्रदर्शन है:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Foo foo = new Foo 
     { 
      CustomerName = "Bubba Gump Shrimp Company", 
      CustomerNumber = "BG60938" 
     }; 

     Console.WriteLine("--- Using JsonProperty names ---"); 
     Console.WriteLine(Serialize(foo, false)); 
     Console.WriteLine(); 
     Console.WriteLine("--- Ignoring JsonProperty names ---"); 
     Console.WriteLine(Serialize(foo, true)); 
    } 

    static string Serialize(object obj, bool useLongNames) 
    { 
     JsonSerializerSettings settings = new JsonSerializerSettings(); 
     settings.Formatting = Formatting.Indented; 
     if (useLongNames) 
     { 
      settings.ContractResolver = new LongNameContractResolver(); 
     } 

     return JsonConvert.SerializeObject(obj, settings); 
    } 
} 

class Foo 
{ 
    [JsonProperty("cust-num")] 
    public string CustomerNumber { get; set; } 
    [JsonProperty("cust-name")] 
    public string CustomerName { get; set; } 
} 

आउटपुट:

--- Using JsonProperty names --- 
{ 
    "cust-num": "BG60938", 
    "cust-name": "Bubba Gump Shrimp Company" 
} 

--- Ignoring JsonProperty names --- 
{ 
    "CustomerNumber": "BG60938", 
    "CustomerName": "Bubba Gump Shrimp Company" 
} 
संबंधित मुद्दे

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