2012-06-18 13 views
9

deserializing जब सभी संपत्तियों को शून्य के रूप में वापस देता है मैं एक आराम अंतराल पूछताछ और एक पीओसीओ क्रमबद्ध करने के RestSharp निष्पादन विधि का उपयोग करने का एक बहुत ही सरल उदाहरण करने की कोशिश कर रहा हूं। हालांकि, मैं जो कुछ भी कोशिश करता हूं वह प्रतिक्रिया में परिणाम देता है। डेटा ऑब्जेक्ट जिसमें सभी गुणों को एक पूर्ण मान के साथ होता है।RestSharp क्लाइंट जेएसओएन प्रतिक्रिया

यहाँ JSON प्रतिक्रिया है:

{ 
    "Result": 
    { 
     "Location": 
     { 
      "BusinessUnit": "BTA", 
      "BusinessUnitName": "CASINO", 
      "LocationId": "4070", 
      "LocationCode": "ZBTA", 
      "LocationName": "Name of Casino" 
     } 
    } 
} 

यहाँ यहाँ अपने परीक्षण कोड

[TestMethod] 
    public void TestLocationsGetById() 
    { 
     //given 
     var request = new RestRequest(); 
     request.Resource = serviceEndpoint + "/{singleItemTestId}"; 
     request.Method = Method.GET; 
     request.AddHeader("accept", Configuration.JSONContentType); 
     request.RootElement = "Location"; 
     request.AddParameter("singleItemTestId", singleItemTestId, ParameterType.UrlSegment); 
     request.RequestFormat = DataFormat.Json; 

     //when 
     Location location = api.Execute<Location>(request);    

     //then 
     Assert.IsNotNull(location.LocationId); //fails - all properties are returned null 

    } 

है और मेरे एपीआई कोड

public T Execute<T>(RestRequest request) where T : new() 
    { 
     var client = new RestClient(); 
     client.BaseUrl = Configuration.ESBRestBaseURL; 

     //request.OnBeforeDeserialization = resp => { resp.ContentLength = 761; }; 

     var response = client.Execute<T>(request); 
     return response.Data; 
    } 

और अंत में है, यहाँ मेरी POCO

है
public class Location 
{   
    public string BusinessUnit { get; set; } 
    public string BusinessUnitName { get; set; } 
    public string LocationId { get; set; } 
    public string LocationCode { get; set; } 
    public string LocationName { get; set; } 
} 

इसके अतिरिक्त, प्रतिक्रिया पर त्रुटि अपवाद और त्रुटि प्रतिक्रिया गुण शून्य हैं।

यह एक बहुत ही साधारण मामला जैसा लगता है, लेकिन मैं पूरे दिन सर्कल में दौड़ रहा हूं! धन्यवाद।

+0

जब आप 'अनुरोध पैरामीटर' के कॉल के बजाय 'अनुरोध' जोड़ें। AddUrlSegment ("singleItemTestId", singleItemTestId) 'क्या होता है, तो क्या होता है? –

उत्तर

8

प्रतिक्रिया में Content-Type क्या है? यदि मानक सामग्री प्रकार जैसे "एप्लिकेशन/जेसन" आदि नहीं है, तो RestSharp समझ नहीं पाएगा कि किस deserializer का उपयोग करना है। यदि यह वास्तव में एक सामग्री नहीं RestSharp द्वारा "समझा" (आप Accept अनुरोध में भेजा निरीक्षण द्वारा सत्यापित कर सकते हैं) टाइप करें, तो आप ऐसा करके इस हल कर सकते हैं:

client.AddHandler("my_custom_type", new JsonDeserializer()); 

संपादित करें:

ठीक है, माफ करना, JSON को देख फिर से, आप की तरह कुछ की जरूरत है:

public class LocationResponse 
    public LocationResult Result { get; set; } 
} 

public class LocationResult { 
    public Location Location { get; set; } 
} 

और फिर कार्य करें:

client.Execute<LocationResponse>(request); 
+0

सामग्री-प्रकार "एप्लिकेशन/जेसन" है। यह लाइन नहीं चाहिए: request.RootElement = "स्थान"; आपके द्वारा सुझाए गए "LocationResponse" ऑब्जेक्ट रैपर की आवश्यकता को हटा दें? – smercer

+0

हम्म, मैंने कोशिश की कि आपके दूसरे संपादन की सिफारिश करने के बाद यह काम करता है, लेकिन मुझे यकीन नहीं है कि मैं समझता हूं कि क्यों, जब तक मैं रूट एलीमेंट प्रॉपर्टी के उद्देश्य को पूरी तरह गलत समझ नहीं पा रहा हूं। अच्छा धन्यवाद! – smercer

+3

JsonDeserializer में 'रूट एलिमेंट' समर्थन केवल तत्व के रूप में अपूर्ण वस्तु पर एक संपत्ति निर्दिष्ट करने का समर्थन करता है, उदा। अपने JSON में "परिणाम"। यह वस्तु पदानुक्रम में गहरी खोज नहीं करता है: https://github.com/restsharp/RestSharp/blob/master/RestSharp/Deserializers/JsonDeserializer.cs – Pete

संबंधित मुद्दे