2014-11-08 3 views
15

मैं नॉर्थविंड OData सेवा का उपयोग करने की कोशिश कर रहा हूँ

using (var client = new HttpClient()) 
    { 
     HttpResponseMessage response = await client.GetAsync(new Uri(url)); 
     ObservableCollection<Product> products = await response.Content.ReadAsAsync<ObservableCollection<Product>>(); 
    } 

लेकिन serializer odata.metadata हिस्सा पसंद करने के लिए प्रतीत नहीं होता है और तथ्य यह है कि वहां 2 odata.type रिकॉर्ड हैं (सुनिश्चित नहीं हैं कि वे क्या हैं)।

क्या ऐसा करने का कोई आसान तरीका है?

उत्तर

25

का उपयोग Json.Net

using (var client = new HttpClient()) 
{ 
    var json = await client.GetStringAsync("http://services.odata.org/V3/OData/OData.svc/Products?$format=json"); 
    var odata = JsonConvert.DeserializeObject<OData>(json); 
} 

public class Value 
{ 
    [JsonProperty("odata.type")] 
    public string Type { set; get; } 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public DateTime ReleaseDate { get; set; } 
    public DateTime? DiscontinuedDate { get; set; } 
    public int Rating { get; set; } 
    public double Price { get; set; } 
} 

public class OData 
{ 
    [JsonProperty("odata.metadata")] 
    public string Metadata { get; set; } 
    public List<Value> Value { get; set; } 
} 
+1

यह ठीक काम करता है। बहुत बहुत धन्यवाद! – Graeme

+0

बीटीडब्ल्यू, क्या सभी ओडाटा सेवाएं इस आकार में डेटा लौटाएंगी? तो मैं मान सकता हूं कि नॉर्थविंड ग्राहक समान होंगे, या क्या मुझे प्रत्येक सेवा को संभालना होगा? – Graeme

+1

@Graeme oData सेवाओं के बारे में कोई जानकारी नहीं है। मैंने इस नमूना को आपके यूआरएल के अनुसार प्रश्न में तैयार किया है। –

3

वहाँ सीधे OData सेवाएं लेने के लिए .NET ग्राहक कर रहे हैं। वी 3 ओडाटा सेवा के लिए, आप Simple.OData.Client, ODataLib for OData v1-3 के साथ प्रयास कर सकते हैं। वी 3 ओडाटा सेवा के लिए, आप OData Client Code Generator के साथ प्रयास कर सकते हैं। ओडाटा क्लाइंट के लिए अन्य पुस्तकालय, आप http://www.odata.org/libraries/ देख सकते हैं।

5

आप दृश्य स्टूडियो में बनाया गया एक शानदार CLR कक्षा पीढ़ी सुविधा नहीं है प्रयोग कर रहे हैं

  1. कॉपी अपने क्लिपबोर्ड में एक OData पेलोड
  2. दृश्य स्टूडियो में मेनू विकल्प संपादित करें का चयन -।>विशेष पेस्ट -> JSON वस्तु कक्षाओं के रूप में चिपकाएं

फिर आप पौंड के में वर्णित के रूप में इन वर्गों में deserialize करने के लिए (Json.NET उपयोग कर सकते हैं जवाब देने के)।

+0

यदि आप केवल "एक्सएमएल क्लासेस पेस्ट करें" मेनू विकल्प देखते हैं तो पेस्ट का उपयोग करके एक्सएमएल मेनू के रूप में एक बार अपने JSON पेस्ट करें। आईडीई इसे देखता है और फिर पेस्ट JSON क्लासेस मेनू आइटम के रूप में जोड़ता है। यह पेस्ट करेगा जहां आपका कर्सर है - इसलिए एक नई खाली डमी क्लास फ़ाइल पेस्ट लक्ष्य के रूप में अच्छी तरह से काम करती है। –

9

OData से प्रतिक्रिया के लिए एक वर्ग को परिभाषित करें (यह एक सामान्य परिभाषा है ताकि आप किसी भी प्रकार से उपयोग कर सकते हैं):

internal class ODataResponse<T> 
{ 
    public List<T> Value { get; set; } 
} 

deserialize इस तरह:

using (var client = new HttpClient()) 
{ 
    HttpResponseMessage response = await client.GetAsync(new Uri(url)); 
    var json = await response.Content.ReadAsStringAsync(); 
    var result = JsonConvert.DeserializeObject<ODataResponse<Product>>(json); 
    var products = result.Value; 
} 
संबंधित मुद्दे