नोट: मैं इस गाइड का अनुसरण कर रहा हूं: https://weblog.west-wind.com/posts/2012/aug/30/using-jsonnet-for-dynamic-json-parsing

मेरा लक्ष्य एक बुनियादी जेसन संरचना है जो इसके अंदर गतिशील संरचनाओं को समायोजित कर सकता है। उदाहरण के लिए, मेरे पास निम्नलिखित संरचनाएं हैं जिनका उपयोग मैं ट्रिगर Json डेटा को स्टोर करने के लिए कर रहा हूं:

public class TriggerJson
{        
    public string TriggerType { get; set; }        
    public string ConfiguredBy { get; set; }
    public dynamic Trigger { get; set; }
}

उपरोक्त संरचना किसी भी गतिशील संरचना को ट्रिगर संपत्ति में संग्रहीत करेगी। उदाहरण के लिए, नीचे वाला:

public class ExpiryTriggerJson
{
    public string ActionType { get; set; }
    public TriggerRecipient[] Recipients { get; set; }
}
//... more Trigger structures like ExpiryTriggerJson above

मैं इस जुर्माना को ट्रिगरजसन की एक सरणी में स्टोर करने में सक्षम हूं। मुद्दा यह है कि जब मैं संरचना को अद्यतन करना चाहता हूं। उदाहरण के लिए, मैं सरणी में TriggerJson प्रविष्टियों में से किसी एक के लिए ट्रिगर प्रॉपर्टी को अपडेट या बदलना चाहता हूं। नीचे मेरा कोड है जिसमें TriggerJson.Trigger प्रॉपर्टी को एक नया ExpiryTriggerJson ऑब्जेक्ट असाइन करते समय Json टाइप को कास्ट करने में समस्या हो रही है। मैं मूल TriggerJson सरणी को JArray में कास्टिंग कर रहा हूं और प्रत्येक प्रविष्टि के माध्यम से जा रहा हूं और जब मुझे प्रतिस्थापित करने के लिए उपयुक्त प्रविष्टि मिलती है, तो मैं ऐसा करने का प्रयास करता हूं:

        var expiryTriggerJson = new ExpiryTriggerJson
        {
            Recipients = taskRecipients.ToArray(),
            ActionType = TriggerJsonHelper.ExpiryTriggerActionType_Task
        };


            JArray tjList = JArray.Parse(originalTriggersJson);
            foreach (dynamic triggerJson in tjList)
            {
                if (triggerJson.TriggerType == ExpiryTriggerType)
                {
                    triggerJson.Trigger = expiryTriggerJson; // this line is throwing an exception
                    triggerJson.ConfiguredBy = configuredBy;
                }
            }
            return JsonConvert.SerializeObject(tjList);

मेरा प्रश्न है: क्या मौजूदा जेसन संरचना को इस तरह से संशोधित करना संभव है? या मुझे एक अलग दृष्टिकोण रखना चाहिए?

0
Riz 5 फरवरी 2021, 04:10
1
हर बार जब आप dynamic का उपयोग करते हैं, तो हमेशा अपने बारे में सोचें कि एक बेहतर तेज़ और सुरक्षित तरीका है। हमेशा जान लें कि आप इस तरह की स्थिति में जल्द या बाद में समाप्त हो जाएंगे।
 – 
TheGeneral
5 फरवरी 2021, 04:14
"// यह लाइन एक अपवाद फेंक रही है" - क्या अपवाद? और आप क्यों उम्मीद करते हैं कि JArray.Parse के परिणामस्वरूप TriggerJson की सूची बन जाएगी (ऐसा नहीं होगा)?
 – 
Llama
5 फरवरी 2021, 04:14
क्योंकि मैं TriggerJson की एक सूची बना रहा हूं और इसे मूल रूप से क्रमबद्ध कर रहा हूं। यह फ़ंक्शन तब दिखा रहा है जब मैं उस सूची को अपडेट करना चाहता हूं। फ़ोरैच लूप काम करता है और प्रत्येक प्रविष्टि में प्रवेश करता है।
 – 
Riz
5 फरवरी 2021, 04:22
"क्योंकि मैं TriggerJson की एक सूची बना रहा हूं और इसे मूल रूप से क्रमबद्ध कर रहा हूं।" - इसका मतलब यह नहीं है कि यह इसे TriggerJson के संग्रह में वापस कर देगा - यह जानने का कोई तरीका नहीं है आप ऐसा करना चाहते हैं। आप शायद List<TriggerJson> tjList = JsonConvert.DeserializeObject<List<TriggerJson>>(); चाहते हैं
 – 
Llama
5 फरवरी 2021, 04:31
आह ठीक है धन्यवाद। में समज। मैंने सोचा कि किसी कारण से पार्सिंग पर्याप्त थी। अब यह ठीक काम करता है। यदि आप इसे उत्तर के रूप में प्रदान करते हैं, तो मैं इसे इस तरह चिह्नित कर सकता हूं।
 – 
Riz
5 फरवरी 2021, 04:43

1 उत्तर

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

आपकी समस्या शायद इन पंक्तियों (मुख्य रूप से पार्स लाइन) के साथ है:

JArray tjList = JArray.Parse(originalTriggersJson);
foreach (dynamic triggerJson in tjList)

JArray के पास यह जानने का कोई तरीका नहीं है कि आप जिस JSON को पार्स कर रहे हैं वह किस प्रकार की वस्तु का प्रतिनिधित्व करता है, इसलिए यह इसे JObject (इस मामले में) की एक सरणी के रूप में पार्स करेगा, न कि एक TriggerJson की सरणी।

आप वास्तव में क्या करना चाहते हैं इसे TriggerJson की सूची के रूप में पार्स करें:

List<TriggerJson> tjList = JsonConvert.DeserializeObject<List<TriggerJson>>(originalTriggersJson);

और फिर आप लूप में dynamic प्रकार के साथ भी कर सकते हैं क्योंकि हम इस प्रकार को जानते हैं:

foreach(TriggerJson triggerJson in tjList)

और यह आपकी समस्या का समाधान करना चाहिए।

पी.एस. Trigger संपत्ति के लिए dynamic का उपयोग करने के बजाय, आप एक सामान्य आधार वर्ग और एक JsonConverter को फिर से देखना चाहेंगे, JSON.NET को यह नहीं पता कि आप किस प्रकार के हैं करने के लिए deserializing, इसलिए Trigger संपत्ति एक विशिष्ट प्रकार के बजाय एक JObject के लिए deserialized किया जाएगा।

इस से आपको अंदाजा हो सकता है कि कैसे उस तक पहुंचें, हालांकि यह संभवतः आसान है यदि आप अपने द्वारा प्राप्त किए गए ट्रिगर के प्रकार को इंगित करने के लिए एक स्ट्रिंग प्रॉपर्टी शामिल करते हैं, और फिर उस संपत्ति को तब पढ़ें जब आप इसे कनवर्टर के साथ deserialize।

0
Llama 5 फरवरी 2021, 04:58