अनुरोध पर A मुझे प्रतिक्रिया मिल रही है:

{  
   "session":{  
      "lifetime":"600",
      "sid":"qweasdzxc:"
   },
   "httpStatus":200,
   "response":{  
      "state":"password",
      "token":"foobar123",
      "next_state":"dispatch"
   }
}

और अनुरोध पर B मुझे एक और प्रतिक्रिया मिल रही है:

{  
   "session":{  
      "lifetime":"600",
      "sid":"qweasdzxc:"
   },
   "httpStatus":200,
   "response":{  
      "origin":"NORMAL",
      "activate_bpa":false,
      "state":"dispatch",
      "next_state":"STOP"
      "is_nordea":false,
      "login_type":"NORMAL"
   },
   "data":{
      "img_src":"example.com"
   }
}

प्रतिक्रियाओं के बीच कुछ अंतर हैं। मुझे इसे कैसे संभालना चाहिए?

मेरा पहला विचार उन वर्गों को बनाना था जिनमें सभी संभावित डेटा होंगे:

public class BaseResponse
{
    public Session session { get; set; }
    public int httpStatus { get; set; }
    public Response Response { get; set; }
}

public class Session
{
    public string lifetime { get; set; }
    public string state { get; set; }
}

public class Response
{
    public string state { get; set; }
    public string token { get; set; }
    public string next_state { get; set; }
    public bool activate_bpa {get; set;}
    public string origin {get; set;}
    public bool is_nordea { get; set;}
    public string login_type {get; set;}

    public Data Data {get; set;}
}

public class Data
{
    public string img_stc {get; set;}
}

अब, मैं अनुरोध A और B से डेटा प्राप्त कर सकता हूं और उनमें से दो को BaseResponse में इस तरह पार्स कर सकता हूं:

var aParsed = JsonConverter.DeserializeObject<BaseResponse>(aContent);
var bParsed = JsonConverter.DeserializeObject<BaseResponse>(bContent);

समस्या यह है कि aParsed में origin, activate_bpa (और अधिक) गुण होंगे, जो कभी भी सेट नहीं होंगे। मैं उन गुणों के साथ वस्तु रखना चाहता हूं जो प्रतिक्रिया में हैं।

मैं वास्तव में एक ही नामस्थान में दो भिन्न Response कक्षाएं नहीं बना सकता। तब मुझे क्या करना चाहिए?

0
dafie 13 अगस्त 2018, 12:09
हालांकि यह एक अलग प्रश्न था, यह उत्तर वास्तव में हो सकता है आपकी समस्या में मदद करें।
 – 
Mateusz
13 अगस्त 2018, 12:19
1
वास्तव में, उस नमूना जोंस को देखते हुए, Data को Response के बजाय BaseResponse से संबंधित नहीं होना चाहिए?
 – 
Arion
13 अगस्त 2018, 12:29

3 जवाब

यदि आप कुछ स्वचालित अक्रमांकन तंत्र का उपयोग करते हैं तो जेनरिक का उपयोग करें।

public class BaseResponse<T>
{
    public Session session { get; set; }
    public int httpStatus { get; set; }
    public Response Response { get; set; }

    public T Data {get; set;}
}

...

public class Data
{
    public string img_stc {get; set;}
}

फिर निर्दिष्ट डेटा वर्ग का उपयोग करके deserialize करें

var response = JsonConverter.Deserialize<BaseResponse<Data>>(json);

आप प्रतिक्रिया वर्ग के साथ भी ऐसा ही कर सकते हैं

public class BaseResponse<TD, TR>
{
    public Session session { get; set; }
    public int httpStatus { get; set; }
    public TR Response { get; set; }

    public TD Data {get; set;}
}

var response = JsonConverter.Deserialize<BaseResponse<Data, ResponseA>>(json);
0
Mabakay 13 अगस्त 2018, 12:30
लेकिन Response के बारे में क्या? मुझे दो अलग-अलग प्रतिक्रियाएं मिल सकती हैं।
 – 
dafie
13 अगस्त 2018, 12:27
BaseResponse वर्ग जेनेरिक में प्रतिक्रिया गुण बनाएं।
 – 
Mabakay
13 अगस्त 2018, 12:39

आप उन्हें गतिशील वस्तुओं में deserialize कर सकते हैं,

जॉब्जेक्ट ओबीजे = जॉब्जेक्ट.पार्स (जेसन);

https://www.newtonsoft.com/json/help/html/ParsingLINQtoJSON.htm

फिर आप objct में डॉट (।) नोटेशन जैसे, obj.origin, obj.state ...ect के माध्यम से गुणों को संदर्भित कर सकते हैं।

लेकिन आप यहां संकलन समय प्रकार की जांच खो देंगे और प्रतिक्रियाओं के लिए कोई आधार डेटा संरचना नहीं है।

0
Wenushka Dikowita 13 अगस्त 2018, 12:31

अपनी प्रतिक्रिया के लिए डेटाटाइप के रूप में डायनामिक का उपयोग करें

public class BaseResponse
{

    public Session session { get; set; }
            public int httpStatus { get; set; }
            public dynamic Response { get; set; }
}
0
Vishal Pawar 13 अगस्त 2018, 12:31