2010-10-13 6 views
18

मैं http://json.codeplex.com/ का उपयोग कर रहा हूं और मैं रूबी आधारित रेस्ट एपीआई से बात कर रहा हूं। समस्या यह है कि अधिकांश संपत्तियों में रूबी अंडरस्कोर नामकरण सम्मेलन होता है। मैं सोच रहा हूं कि अगर कोई इस तरह से जानता है कि मैं बहुत सारे जेसनप्रोपर्टी को जोड़ने से बच सकता हूं।सी # JSON.NET सम्मेलन जो रुबी संपत्ति नामकरण सम्मेलनों का पालन करता है?

उदाहरण के लिए मैं JsonProperty विशेषता जोड़ने से बचना चाहते हैं और serializer सेटिंग्स में निर्माण किया है एक सम्मेलन इतना है कि यह नेट नामकरण परंपरा :)

public class Member 
{ 
    [JsonProperty(PropertyName = "avatar_url")] 
    public string AvatarUrl { get; set; } 

    [JsonProperty(PropertyName = "twitter_screen_name")] 
    public string TwitterScreenName { get; set; } 

    [JsonProperty(PropertyName = "website_url")] 
    public string WebSiteUrl { get; set; } 
} 
करने के लिए एक अंडरस्कोर से कोशिश करते हैं और नक्शा गुण जानता है

उत्तर

30

अद्यतन - सितंबर 2016:

Json.NET 9.0.1 SnakeCaseNamingStrategy है। आप इसका उपयोग twitter_screen_name शैली गुणों को स्वचालित रूप से करने के लिए कर सकते हैं।


इनहेरिट DefaultContractResolver से और ओवरराइड ResolvePropertyName संपत्ति के नाम फ़ॉर्मेट करने के लिए के रूप में आप चाहते हैं।

CamelCasePropertyNamesContractResolver संपत्ति नामों में एक समान वैश्विक परिवर्तन करता है।

+0

धन्यवाद जेम्स इसे एक शॉट देगा और मेरे निष्कर्ष यहां अन्य लोगों के लिए पोस्ट करेगा जो इस स्थिति में भाग ले सकते हैं। – superlogical

30

इस पढ़ें: http://nyqui.st/json-net-newtonsoft-json-lowercase-keys

public class UnderscoreMappingResolver : DefaultContractResolver 
    { 
     protected override string ResolvePropertyName(string propertyName) 
     { 
      return System.Text.RegularExpressions.Regex.Replace(
       propertyName, @"([A-Z])([A-Z][a-z])|([a-z0-9])([A-Z])", "$1$3_$2$4").ToLower(); 
     } 
    } 
+0

यह लगातार दो पूंजी अक्षरों वाले गुणों के लिए काम नहीं करता है। 'यह Iestest' 'this_is_atest' बन जाता है। – vaindil

4

यह भी मुझे

var settings = new JsonSerializerSettings 
{ 
    ContractResolver = new PascalCaseToUnderscoreContractResolver() 
}; 
var rawJson = "{ test_property:'test' }" 
var myObject = JsonConvert.DeserializeObject<MyObjectType>(rawJson, settings); 

के लिए काम किया Humanizer समारोह "अंडरस्कोर" का उपयोग

https://www.nuget.org/packages/Humanizer/1.37.7

http://humanizr.net/#underscore

public class PascalCaseToUnderscoreContractResolver : DefaultContractResolver 
{ 
    protected override string ResolvePropertyName(string propertyName) => propertyName.Underscore(); 
} 

MyObjectType वर्ग

public Class MyObjectType 
{ 
    public string TestProperty {get;set;} 
} 
7

संस्करण 9 के रूप में, एक नया नामकरण रणनीति संपत्ति यह करने के लिए मौजूद है, और यह एक अंतर्निहित SnakeCaseNamingStrategy वर्ग है। नीचे दिए गए कोड का प्रयोग करें और contractResolver को SerializerSettings.ContractResolver के रूप में पंजीकृत करें।

var contractResolver = new DefaultContractResolver(); 
contractResolver.NamingStrategy = new SnakeCaseNamingStrategy(); 

यही वर्ग डिफ़ॉल्ट रूप से शब्दकोशों शामिल नहीं है, और यह किसी भी मैन्युअल रूप से सेट संपत्ति मूल्यों को भी पार नहीं करता है। वे दो पैरामीटर हैं जिन्हें अधिभार में पारित किया जा सकता है:

// true parameter forces handling of dictionaries 
// false prevents the serializer from changing anything manually set by an attribute 
contractResolver.NamingStrategy = new SnakeCaseNamingStrategy(true, false); 
संबंधित मुद्दे