2015-09-28 6 views
5

पॉप्युलेट करें, मैं एक तृतीय पक्ष webservice से कनेक्ट करता हूं जो एक जटिल JSON ऑब्जेक्ट देता है जिसमें केवल मुझे आवश्यक जानकारी के कुछ बिट्स होते हैं।JsonSerializer का उपयोग करके JSON डेटा का चयन करें और सी # ऑब्जेक्ट

असल में, मुझे केवल "मूल्य" में सरणी की आवश्यकता है। उस सरणी से, मुझे बस "आईडी", "शीर्षक" और "स्थिति" गुणों की आवश्यकता है।

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

public class Project 
{ 
    public String Id { get; set; } 
    public String Title { get; set; } 
    public String Status { get; set; } 
} 

मैं JSON पढ़ने के लिए इस कोड का उपयोग और बदलने करने के लिए कोशिश कर रहा हूँ:

using (WebResponse response = request.GetResponse()) 
{ 
    using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
    { 
     var serializer = new JsonSerializer(); 
     var jsonTextReader = new JsonTextReader(reader); 
     returnValue = serializer.Deserialize<Project>(jsonTextReader); 
    } 
} 

उदाहरण JSON:

{ 
    "odata.metadata":"http://school.edu/Api/1/$metadata#Projects", 
    "odata.count":"3", 
    "value":[ 
     { 
      "odata.id":"http://school.edu/Api/1/Projects('123')", 
      "[email protected]":"http://school.edu/Api/1/Projects('123')/RelatedProjects", 
      "[email protected]":"http://school.edu/Api/1/Projects('123')/Tags", 
      "[email protected]":"http://school.edu/Api/1/Projects('123')/Categories", 
      "[email protected]":"http://school.edu/Api/1/Projects('123')/ep", 
      "#CreateLike":{ 
        "target":"http://school.edu/Api/1/Projects('123')/CreateLike" 
        }, 
      "#CreateShortcut":{ 
         "target":"http://school.edu/Api/1/Projects('123')/CreateShortcut" 
         }, 
      "#Play":{ 
         "target":"http://school.edu/Play/123" 
         }, 
      "#SendInvitation":{ 
         "target":"http://school.edu/Api/1/Projects('123')/SendInvitation" 
         }, 
      "#CopyProject":{ 
         "target":"http://school.edu/Api/1/Projects('123')/CopyProject" 
         }, 
      "#AddVideoPodcast":{ 
         "target":"http://school.edu/Api/1/Projects('123')/AddVideoPodcast" 
         }, 
      "#AddEP":{ 
         "target":"http://school.edu/Api/1/Projects('123')/AddEP" 
         }, 
      "Id":"123", 
      "Title":"Test Title 1", 
      "Status":"Viewable" 
     }, 
     { 
      "odata.id":"http://school.edu/Api/1/Projects('456')", 
      "[email protected]":"http://school.edu/Api/1/Projects('456')/RelatedProjects", 
      "[email protected]":"http://school.edu/Api/1/Projects('456')/Tags", 
      "[email protected]":"http://school.edu/Api/1/Projects('456')/Categories", 
      "[email protected]":"http://school.edu/Api/1/Projects('456')/ep", 
      "#CreateLike":{ 
        "target":"http://school.edu/Api/1/Projects('456')/CreateLike" 
        }, 
      "#CreateShortcut":{ 
         "target":"http://school.edu/Api/1/Projects('456')/CreateShortcut" 
         }, 
      "#Play":{ 
         "target":"http://school.edu/Play/456" 
         }, 
      "#SendInvitation":{ 
         "target":"http://school.edu/Api/1/Projects('456')/SendInvitation" 
         }, 
      "#CopyProject":{ 
         "target":"http://school.edu/Api/1/Projects('456')/CopyProject" 
         }, 
      "#AddVideoPodcast":{ 
         "target":"http://school.edu/Api/1/Projects('456')/AddVideoPodcast" 
         }, 
      "#AddEP":{ 
         "target":"http://school.edu/Api/1/Projects('456')/AddEP" 
         }, 
      "Id":"456", 
      "Title":"Test Title 2", 
      "Status":"Viewable" 
     }, 
     { 
      "odata.id":"http://school.edu/Api/1/Projects('789')", 
      "[email protected]":"http://school.edu/Api/1/Projects('789')/RelatedProjects", 
      "[email protected]":"http://school.edu/Api/1/Projects('789')/Tags", 
      "[email protected]":"http://school.edu/Api/1/Projects('789')/Categories", 
      "[email protected]":"http://school.edu/Api/1/Projects('789')/ep", 
      "#CreateLike":{ 
        "target":"http://school.edu/Api/1/Projects('789')/CreateLike" 
        }, 
      "#CreateShortcut":{ 
         "target":"http://school.edu/Api/1/Projects('789')/CreateShortcut" 
         }, 
      "#Play":{ 
         "target":"http://school.edu/Play/789" 
         }, 
      "#SendInvitation":{ 
         "target":"http://school.edu/Api/1/Projects('789')/SendInvitation" 
         }, 
      "#CopyProject":{ 
         "target":"http://school.edu/Api/1/Projects('789')/CopyProject" 
         }, 
      "#AddVideoPodcast":{ 
         "target":"http://school.edu/Api/1/Projects('789')/AddVideoPodcast" 
         }, 
      "#AddEP":{ 
         "target":"http://school.edu/Api/1/Projects('789')/AddEP" 
         }, 
      "Id":"789", 
      "Title":"Test Title 3", 
      "Status":"Viewable" 
     } 
    ], 
    "odata.nextLink":"http://school.edu/Api/1/Folders('xyz')/Projects?$skip=10&$top=10" 
} 

मैं सिर्फ एक मिल यह मेरी कक्षा है वापस शून्य वस्तु। लेकिन डीबगर में, मैं देख सकता हूं कि यह webservice से सभी JSON डेटा खींच रहा है।

मैं जेएसओएन से क्या चाहता हूं, मेरी सी # वस्तुओं का निर्माण कैसे कर सकता हूं, और बाकी सभी को अनदेखा कर सकता हूं?

धन्यवाद!

+1

Deserialize दस्तावेज़ीकरण को देखते हुए इसके लिए अंतर्निहित कार्यक्षमता प्रतीत नहीं होती है। इसलिए उत्तर देने के लिए समय बिताने के लिए आप पूरी चीज को निराश नहीं कर सकते हैं, फिर चुनिंदा संपत्तियों का चयन करें? –

+0

@ एम.एडमंडसन धन्यवाद। बेवकूफ सवाल, लेकिन deserializing के बिना, मुझे डेटा/विशेषताओं की आवश्यकता होगी? – SkyeBoniwell

+1

क्या आप पूरी प्रतिक्रिया deserialize करने में सक्षम नहीं हैं? –

उत्तर

5

आप Json.NET (Newtonsoft json) का उपयोग कर सकते हैं, तो आप Linq-to-Json इस [1]

//using Newtonsoft.Json.Linq; 
var jsonString = File.ReadAllText(@"C:YourDirectory\file.json"); //source 
var projects = new List<Project>(); //Your result 

JObject data = JObject.Parse(jsonString); 
foreach (var value in data["value"]) 
{ 
    projects.Add(new Project 
    { 
     Id = value["Id"].ToString(), 
     Status = value["Status"].ToString(), 
     Title = value["Title"].ToString() 
    }); 
} 

की तरह उपयोग कर सकते हैं या, आप भी JObject इस तरह deserialize कर सकते हैं [2]

var jsonReader = data["value"].CreateReader(); 
projects = new JsonSerializer().Deserialize<List<Project>>(jsonReader); 

दोनों ठीक काम करता है, लेकिन कौन सा बेहतर है?

दूसरा दृष्टिकोण मतलब कम कोड है (विशेष रूप से, यदि आपके पास Project कक्षा में कई गुण हैं, तो आपको कोड में प्रत्येक गुण को मैप करने के लिए कोड की कई पंक्तियां लिखनी होंगी [1])।

लेकिन पहले दृष्टिकोण का प्रदर्शन कई बार बेहतर है! दिए गए जेसन डेटा के लिए, कोड [1] 1 एमएस में कोड चलाता है जबकि कोड [2] 100 एमएस से अधिक लेता है!


अद्यतन

बाद जेम्स न्यूटन-राजा (जो Json.NET :) लिखा से इनपुट, इस [3]

projects = data["value"].ToObject<List<Project>>(); 
करने का एक और भी अधिक सुंदर तरीका है

और अनुमान लगाओ क्या! यह कोड [3] दृष्टिकोण के समय लगभग आधा लेता है [1]। तो, सभी दृष्टिकोणों से, यह सबसे अच्छा तरीका होना चाहिए!

+3

आपका दूसरा उदाहरण बेहतर किया जा सकता है: डेटा ["मान"]। ToObject <सूची >() –

+2

@ जेम्स न्यूटन-किंग आह! मुझे यह नहीं पता था, धन्यवाद। मैंने अपना जवाब उसमें शामिल करने के लिए अपडेट किया है, और यह मेरे स्टॉपवॉच टेस्ट के अनुसार सर्वश्रेष्ठ प्रदर्शन भी दिखाता है :) –

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

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