मैं जेएसओएन स्कीमा को सी # कक्षा में प्रीबिल्ड चरण के रूप में परिवर्तित करने के लिए कक्षा या उपकरण की तलाश में हूं।

मुझे कई "होम-ब्रू" समाधान मिले हैं (jsonschema.net, NJsonSchema, ...), लेकिन किसी कंपनी/प्रोजेक्ट से संबंधित कुछ परिपक्व/आधिकारिक कोड का उपयोग करना पसंद करेंगे। मैं समझता हूं कि Newtonsoft.json.Schema पैकेज केवल इसे दूसरे तरीके से करने में सक्षम है (C# Class -> JSON)

मैंने आश्चर्यजनक रूप से पाया है कि विजुअल स्टूडियो "एडिट -> पेस्ट स्पेशल -> जेएसओएन को कक्षाओं के रूप में पेस्ट करें" का उपयोग करके बॉक्स के बाहर ऐसा करने में सक्षम है। क्या इस सुविधा के पीछे कोड/वर्ग/निष्पादन योग्य/डीएलएल प्री-बिल्ड चरण के लिए प्रोग्रामेटिक रूप से कितना सुलभ है?

2
Stiefel 4 जिंदा 2018, 15:17
1
रनटाइम पर यह कैसे काम करना चाहिए? यदि आप उस वर्ग को रनटाइम पर बनाएंगे, तो आप अपने कोड में इसके गुणों का उपयोग कैसे करेंगे? यदि आपको इसे रनटाइम पर करने की आवश्यकता है, तो क्या dynamic पर्याप्त नहीं होगा? और यदि आपको अपना कोड लिखते समय इसकी आवश्यकता है, तो JSON को कक्षाओं के रूप में पेस्ट करें का उपयोग करने में क्या समस्या है?
 – 
Oliver
4 जिंदा 2018, 16:14
ठीक है, मैंने प्रश्न के रनटाइम भाग को हटा दिया है, यह शायद एक अलग प्रश्न है। बस "JSON को कक्षाओं के रूप में चिपकाना" हमारे लिए एक अच्छा समाधान नहीं है। हम JSON स्कीमा (जैसे IDL) का उपयोग करके अपनी इंटरफ़ेस परिभाषाओं के लिए एक केंद्रीय स्थान रखना चाहते हैं और फिर प्री-बिल्ड के दौरान C# कक्षाएं उत्पन्न करना चाहते हैं।
 – 
Stiefel
4 जिंदा 2018, 17:08
क्या आपने json2csharp.com का उपयोग किया था?
 – 
Gaurang Dave
5 जिंदा 2018, 06:34
NJsonSchema एक परिपक्व परियोजना की तरह दिखती है। इसमें कमांड लाइन टूल nswag.exe है जिसका उपयोग इस तरह से csharp कोड जेनरेट करने के लिए किया जा सकता है: "nswag jsonschema2csclient / input:JsonSchema.json / output:MyClasses.cs"
 – 
Stiefel
10 जिंदा 2018, 20:13
 – 
xdtTransform
4 पद 2020, 12:42

2 जवाब

सबसे बढ़िया उत्तर

जैसा कि @Stiefel ने उल्लेख किया है, आप इसके लिए nswag का उपयोग कर सकते हैं। पहले अपने प्रोजेक्ट में NSwag.MSBuild nuget पैकेज जोड़ें, जो आपको nswag को संदर्भित करने के लिए $(NSwagExe) मैक्रो का उपयोग करने की भी अनुमति देता है। फिर, अपने प्रोजेक्ट में प्री-बिल्ड स्टेप जोड़ें, मेरे मामले में ऐसा दिखता है:

<Target Name="PreBuild" BeforeTargets="PreBuildEvent">
    <Exec Command="$(NSwagExe) jsonschema2csclient /name:Manifest /namespace:ManifestCreator.Models /input:$(SolutionDir)schemas\SingleFileSchema.0.1.0.json /output:$(ProjectDir)Models\ManifestSchema.cs" />
</Target>
3
UnionP 4 पद 2020, 10:29

आप इसे विजुअल स्टूडियो टेम्पलेट ट्रांसफॉर्मेशन (टी 4) फाइलों के साथ करने में सक्षम होना चाहिए। कुछ साल पहले मैंने उन्हें इसी तरह के परिदृश्य के लिए इस्तेमाल किया था - मालिकाना डब्लूएसडीएल-जैसे एक्सएमएल प्रारूप से सी # सेवा प्रॉक्सी कक्षाएं उत्पन्न करना। दुर्भाग्य से मेरे पास अब कोड तक पहुंच नहीं है, लेकिन T4 और codegen के लिए Googling शुरू करने के बाद यह पता लगाना बहुत आसान है।

आप एक्स्टेंसिबिलिटी / ऑटोमेशन मॉडल, उर्फ ​​DTE यह पता लगाने के लिए कि क्या आप बिल्ट-इन फीचर तक पहुंच सकते हैं (जिसे मैं T4 से लॉन्च करूंगा)।

T4 वास्तव में एकल फ़ाइलों (इसलिए "टेम्पलेट") के लिए है, लेकिन आप IDE से आसानी से टेम्पलेट "बिल्ड" को किक कर सकते हैं जो कई फाइलें उत्पन्न करता है। उच्च स्तर यह है कि आप इनपुट पढ़ने के लिए Json.Net जैसी सहायक असेंबली आयात करेंगे, फिर नई फाइलें लिखने के लिए नियमित पुरानी फ़ाइल I/O का उपयोग करें। इसमें ज्यादा जादू नहीं है। डीटीई बाहरी प्रक्रियाओं को शुरू करने या पूरा होने पर मानव समीक्षा के लिए समेकित बिल्ड लॉग पेश करने जैसे काम कर सकता है।

कुछ चेतावनी: मैंने अभी तक VS2017 में T4 का उपयोग नहीं किया है, लेकिन मैंने पढ़ा है कि इसका उपयोग शुरू करने के लिए अतिरिक्त चरणों की आवश्यकता है उन्हें, और यदि आप पहले के वीएस पर हैं तो स्पष्ट रूप से एक समस्या जहां वे आपके VS2017 में माइग्रेट करने के बाद शुरू में आपके प्रोजेक्ट के साथ लोड नहीं होते हैं।

1
McGuireV10 4 जिंदा 2018, 17:46