Json.net के साथ धारावाहिक बनाने पर मैं संपत्ति के नाम कैसे बदल सकता हूं?


434

मेरे पास C # DataSet ऑब्जेक्ट में कुछ डेटा है। मैं इसे अभी इस तरह से Json.net कन्वर्टर का उपयोग करके क्रमबद्ध कर सकता हूं

DataSet data = new DataSet();
// do some work here to populate 'data'
string output = JsonConvert.SerializeObject(data);

हालाँकि, यह data.json फ़ाइल को प्रिंट करते समय से गुण नामों का उपयोग करता है । मैं संपत्ति के नामों को कुछ अलग करना चाहता हूं (जैसे, 'फू' को 'बार' में बदलना)।

में Json.net प्रलेखन , 'serializing और deserializing JSON' के तहत → 'क्रमबद्धता गुण' यह कहते हैं, "JsonPropertyAttribute ... की अनुमति देता है नाम अनुकूलित किया जा करने के लिए"। लेकिन कोई उदाहरण नहीं है। क्या किसी को पता है कि संपत्ति के नाम को किसी और चीज़ में बदलने के लिए JsonPropertyAttribute का उपयोग कैसे करें?

( प्रलेखन के लिए सीधा लिंक )

Json.net के दस्तावेज़ विरल प्रतीत होते हैं। यदि आपके पास एक महान उदाहरण है तो मैं इसे आधिकारिक दस्तावेज में शामिल करने का प्रयास करूंगा। धन्यवाद!


3
FYI करें, नमूने के तहत प्रलेखन में इसका एक उदाहरण है -> सीरियल को JSON -> JsonPropertyAArtribute नाम । निश्चित नहीं है कि इसे किस बिंदु पर जोड़ा गया था।
ब्रायन रोजर्स

जवाबों:


791

आप उस संपत्ति को सजा सकते हैं जिसे आप उसके नाम को उस [JsonProperty]विशेषता के साथ नियंत्रित करना चाहते हैं जो आपको एक अलग नाम निर्दिष्ट करने की अनुमति देती है:

using Newtonsoft.Json;
// ...

[JsonProperty(PropertyName = "FooBar")]
public string Foo { get; set; }

दस्तावेज़ीकरण: सीरियलाइज़ेशन विशेषताएँ


1
क्या यह आवश्यक है कि मैं अपने डेटा को एक कस्टम ऑब्जेक्ट में पढ़ूं जिसे मैं डेटासेट के बजाय बनाता हूं?
पुलि स

3
@culix, हाँ, इसे किसी मॉडल का उपयोग करने की आवश्यकता है। एक डेटासेट एक कमजोर टाइप की गई संरचना है, इसलिए इसके लिए संपत्ति के नामों के बारे में बात करना बहुत तर्कसंगत नहीं है।
डारिन दिमित्रोव

76
एक आशुलिपि के रूप में, आप यह भी कर सकते हैं[JsonProperty("FooBar")]
बार्ट वर्कोइजेन

2
@DarinDimitrov Json .NET के बिना ऐसा करने का एक तरीका है?
CH81

12
हालांकि, एक मॉडल का उपयोग करना आसान है, बस अपने JSON का एक नमूना लें और इसे एक खाली .cs फ़ाइल में "पेस्ट स्पेशल" -> "PSON JSON को क्लासेस" के रूप में पेस्ट करें। - यह विजुअल स्टूडियो में बनाया गया है। - वहां से, आपको मूल रूप से .NET नामकरण सम्मेलनों, आदि (पूर्व के लिए एक शीर्षक मामले कनवर्टर का उपयोग करना, और बाद के लिए JsonProperty विशेषता का उपयोग करने के लिए) शीर्षक मामले / नाम बदलने के सामान के रूप में बस चीजों को सेट करने की आवश्यकता है।
ब्रेनस्ल्गस 83

71

यदि आपके पास गुणों को बदलने के लिए कक्षाओं तक पहुंच नहीं है, या हमेशा एक ही नाम बदलने वाली संपत्ति का उपयोग नहीं करना चाहते हैं, तो रीनेमिंग को कस्टम रिज़ॉल्वर बनाकर भी किया जा सकता है।

उदाहरण के लिए, यदि आपके पास एक वर्ग है MyCustomObject, जिसका नाम संपत्ति है LongPropertyName, तो आप इस तरह एक कस्टम रिज़ॉल्वर का उपयोग कर सकते हैं ...

public class CustomDataContractResolver : DefaultContractResolver
{
  public static readonly CustomDataContractResolver Instance = new CustomDataContractResolver ();

  protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
  {
    var property = base.CreateProperty(member, memberSerialization);
    if (property.DeclaringType == typeof(MyCustomObject))
    {
      if (property.PropertyName.Equals("LongPropertyName", StringComparison.OrdinalIgnoreCase))
      {
        property.PropertyName = "Short";
      }
    }
    return property;
  }
}

फिर क्रमबद्धता के लिए कॉल करें और रिज़ॉल्वर की आपूर्ति करें:

 var result = JsonConvert.SerializeObject(myCustomObjectInstance,
                new JsonSerializerSettings { ContractResolver = CustomDataContractResolver.Instance });

और परिणाम को {"LongPropertyName" के बजाय {"लघु": "प्रोप वैल्यू"} को छोटा कर दिया जाएगा : "प्रोप वैल्यू"}

कस्टम रिसोल्वर के बारे में अधिक जानकारी यहाँ


1
यह एक बेहतर समाधान है यदि आपकी कक्षा को किसी अन्य असेंबली में क्रमबद्ध करने की घोषणा की गई है जिसमें न्यूटनसॉफ्ट का एक अलग संस्करण शामिल है। Json पैकेज। (यह भी कोई त्रुटि नहीं फेंक सकता है)। DefaultContractResolverएक ही विधानसभा जहां JsonConvert.Serialize () विधि प्रयोग किया जाता है में डाल दिया जाना चाहिए।
आर्टेमियस

6

अभी भी यह करने के लिए एक और तरीका है, जो एक विशेष उपयोग कर रहा है NamingStrategy है, जो उन लोगों के साथ सजाने द्वारा एक वर्ग या एक संपत्ति के लिए लागू किया जा सकता [JSonObject]या [JsonProperty]

पूर्वनिर्धारित नामकरण की तरह रणनीति है CamelCaseNamingStrategy, लेकिन आप अपने स्वयं के कार्यान्वयन कर सकते हैं।

विभिन्न नामकरण रणनीतियों का कार्यान्वयन यहां पाया जा सकता है: https://github.com/JamesNK/Newtonsoft.Json/tree/master/Src/Newtonsoft.Json/Serialization


3
यदि आप सक्षम हैं, तो कृपया एक कस्टम NamingStrategy कार्यान्वयन का एक उदाहरण साझा करें
user1007074

बिलकूल नही। आपको इसे अपने आप से करना चाहिए था, लेकिन मैं आपको यह बताने के लिए समय दूंगा कि आपको बस newtonsoft.com/json/help/html/ पर वार करना है। आप मौजूदा कक्षाओं के कार्यान्वयन को देख सकते हैं, और अपना खुद का बना सकते हैं।
जटबे

धन्यवाद - मुझे अपनी टिप्पणी को अपडेट करना चाहिए: वास्तव में, उस महिमा के लिए धन्यवाद, जो कि GitHub है, एक उदाहरण के रूप में न्यूटनसॉफ्ट के स्वयं के कार्यान्वयन में से एक का उपयोग कर सकता है, कहते हैं, यह एक
user1007074

8
@ जेटा, यह स्टैकओवरफ्लो की भावना नहीं है। और एक प्रोग्रामर के रूप में जो सिर्फ मेरा काम करना चाहता है, स्पष्ट रूप से, मेरे लिए आपके द्वारा प्रदान किए गए कोड को उठाना एक हजार गुना बेहतर होगा। और आपको मेरा वोट भी मिला होगा। मेरे पास 18 साल का कोडिंग अनुभव है, और मुझे ट्रिपल # द्वारा "# में विशेषज्ञ" के रूप में रैंक किया गया है। हर समस्या को "पाठक के लिए व्यायाम" के रूप में छोड़ने की आवश्यकता नहीं है। कभी-कभी हम सिर्फ अपना काम करना चाहते हैं और आगे बढ़ना चाहते हैं।
bboyle1234

2
मैं आपसे सहमत हूं, और मैं आमतौर पर इस तरह की टिप्पणी नहीं लिखता हूं। हालांकि, मैं आश्वस्त कर सकता हूं कि इस मामले में, लिंक किए गए कोड को देखना किसी भी स्पष्टीकरण से बेहतर है जो मैं दे सकता हूं। और json.net एक बहुत अच्छी तरह से प्रलेखित ओपन सोर्स लाइब्रेरी है। लागू करने के लिए लिंक (सही उदाहरण)
JotaBe
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.