2015-04-30 17 views
6

में मॉडल पर सीरियलज़ेबल विशेषता का उपयोग करना मेरे पास निम्न परिदृश्य है: मैं वेबएपीआई का उपयोग कर रहा हूं और एक मॉडल के आधार पर उपभोक्ता को JSON परिणाम लौटा रहा हूं। अब मुझे मॉडल 64 को मॉडल को क्रमशः कैश में रखने में सक्षम होने और/या ऑडिटिंग उद्देश्यों के लिए उनका उपयोग करने में सक्षम होने के लिए अतिरिक्त आवश्यकता है।वेबएपीआई

मॉडल::

[Serializable] 
public class ResortModel 
{ 
    public int ResortKey { get; set; } 

    public string ResortName { get; set; } 
} 

[Serializable] बिना विशेषता JSON उत्पादन होता है समस्या यह है कि जब मैं मॉडल के लिए [Serializable] विशेषता जोड़ सकते हैं ताकि Base64 के लिए मॉडल परिवर्तित करने के लिए, इस प्रकार JSON उत्पादन परिवर्तन है :

{ 
    "ResortKey": 1, 
    "ResortName": "Resort A" 
} 

[Serializable] साथ विशेषता JSON उत्पादन होता है:

{ 
    "<ResortKey>k__BackingField": 1, 
    "<ResortName>k__BackingField": "Resort A" 
} 

मैं JSON के आउटपुट को बदले बिना [Serializable] विशेषता का उपयोग कैसे कर पाऊंगा?

उत्तर

22

डिफ़ॉल्ट रूप से, Json.NET Serializable विशेषता को अनदेखा करता है। हालांकि, this answerMaggie Ying द्वारा टिप्पणियों के मुताबिक (नीचे उद्धृत किया गया है क्योंकि टिप्पणियां आखिरी नहीं हैं), वेबएपीआई उस व्यवहार को ओवरराइड करता है, जो आपके आउटपुट का कारण बनता है।

Json.NET serializer डिफ़ॉल्ट रूप से सही पर IgnoreSerializableAttribute निर्धारित किया है। वेबएपीआई में, हमने इसे गलत पर सेट किया है। इस समस्या को आपने क्यों दबाया है क्योंकि Json.NET गुणों को अनदेखा करता है: "Json.NET अब उन प्रकारों का पता लगाता है जिनमें SerializableAttribute है और सार्वजनिक और निजी दोनों प्रकार के सभी क्षेत्रों को क्रमबद्ध करता है, और गुणों को अनदेखा करता है" (james.newtonking.com/archive/2012/04/11/… से उद्धृत)

एक साधारण उदाहरण दर्शाता है कि वेबएपीआई के बिना एक ही व्यवहार इस तरह दिख सकता:

using Newtonsoft.Json; 
using Newtonsoft.Json.Serialization; 
using System; 
namespace Scratch 
{ 
    [Serializable] 
    class Foo 
    { 
     public string Bar { get; set; } 
    } 

    class Program 
    { 
     static void Main() 
     { 
      var foo = new Foo() { Bar = "Blah" }; 
      Console.WriteLine(JsonConvert.SerializeObject(foo, new JsonSerializerSettings() 
       { 
        ContractResolver = new DefaultContractResolver() 
        { 
         IgnoreSerializableAttribute = false 
        } 
       })); 
     } 
    } 
} 

इस व्यवहार के कई तरीके हैं। एक एक सादे JsonObject विशेषता के साथ अपने मॉडल को सजाने के लिए है:

[Serializable] 
[JsonObject] 
class Foo 
{ 
    public string Bar { get; set; } 
} 

एक और तरीका है अपने Application_Start() में डिफ़ॉल्ट सेटिंग ओवरराइड करने के लिए है। this answer के अनुसार, डिफ़ॉल्ट सेटिंग्स यह करना चाहिए:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings = new Newtonsoft.Json.JsonSerializerSettings(); 

यदि वह काम नहीं करता है, आप इसके बारे में स्पष्ट हो सकता है:

GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings() 
    { 
     ContractResolver = new DefaultContractResolver() 
     { 
      IgnoreSerializableAttribute = true 
     } 
    }; 
+0

धन्यवाद बार्ट, महान जवाब! मैं 'ग्लोबल कॉन्फ़िगरेशन का उपयोग करने के लिए गया। कॉन्फ़िगरेशन.फॉर्मेटर्स। जेसनफॉर्मेटर। सिरीलाइज़र सेटिंग्स = नया न्यूटॉन्सफ्ट.जेसन। जेसनएसरियललाइज़र सेटिंग्स(); इसलिए 'हर [जेसनऑब्जेक्ट]' के साथ हर मॉडल को सजाने के लिए नहीं है। – Ebbs

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