C # के साथ JSON का वर्णन करें


206

मैं फेसबुक मित्र के ग्राफ़ एपीआई कॉल को वस्तुओं की सूची में शामिल करने की कोशिश कर रहा हूं । JSON ऑब्जेक्ट दिखता है:

{"data":[{"id":"518523721","name":"ftyft"},
         {"id":"527032438","name":"ftyftyf"},
         {"id":"527572047","name":"ftgft"},
         {"id":"531141884","name":"ftftft"},
         {"id":"532652067","name"...

List<EFacebook> facebooks = new JavaScriptSerializer().Deserialize<List<EFacebook>>(result);

यह काम नहीं कर रहा है, क्योंकि आदिम वस्तु अमान्य है। मैं इसे कैसे निष्क्रिय कर सकता हूं?


3
विशेष रूप से इस तरह के जोंस को पूरा करने के लिए एक कस्टम डेज़राइज़र लिखें ...
ashutosh raina

2
या आप एक का उपयोग कर सकते हैं Dictionary<string,string>, बाहर की जाँच करें: stackoverflow.com/questions/7699972/…
Kakashi

9
आपका दोस्त: json2csharp.com
nawfal

4
वास्तव में दृश्य स्टूडियो (2013 के रूप में, या 2012 में वेब टूल इंस्टॉल के साथ) में इस सटीक कार्यक्षमता का निर्माण किया गया है: संपादित करें> पेस्ट विशेष> कक्षाएं के रूप में पेस्ट करें
16

जवाबों:


264

आपको इस तरह की संरचना बनाने की आवश्यकता है:

public class Friends
{

    public List<FacebookFriend> data {get; set;}
}

public class FacebookFriend
{

    public string id {get; set;}
    public string name {get; set;}
}

तब आपको ऐसा करने में सक्षम होना चाहिए:

Friends facebookFriends = new JavaScriptSerializer().Deserialize<Friends>(result);

मेरी कक्षाओं के नाम केवल एक उदाहरण हैं। आपको उचित नामों का उपयोग करना चाहिए।

एक नमूना परीक्षण जोड़ना:

string json =
    @"{""data"":[{""id"":""518523721"",""name"":""ftyft""}, {""id"":""527032438"",""name"":""ftyftyf""}, {""id"":""527572047"",""name"":""ftgft""}, {""id"":""531141884"",""name"":""ftftft""}]}";

Friends facebookFriends = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<Friends>(json);

foreach(var item in facebookFriends.data)
{
    Console.WriteLine("id: {0}, name: {1}", item.id, item.name);
}

पैदा करता है:

id: 518523721, name: ftyft
id: 527032438, name: ftyftyf
id: 527572047, name: ftgft
id: 531141884, name: ftftft

3
हाँ, मैं क्या नहीं करना चाहता, एक नई वस्तु बनाने के लिए childs। मुझे लगता है कि मैं आदिम वस्तु को बाहर निकालने के लिए जासन को प्रतिस्थापित करने वाला हूं। धन्यवाद।

@ केविन होल्डिच सुधार के लिए धन्यवाद। मैं एक महत्वपूर्ण बिट से चूक गया :)
इकारस

2
मुझे इस System.Web.Script.Serialization.JavaScriptSerializer () के बारे में क्या पसंद नहीं है, यह है कि आपको हमेशा एक परिभाषित प्रकार T की आवश्यकता है। जावा में यह org.java लाइब्रेरी (पैकेज) है जो सभी गुमनाम बनी हुई है: "JSONBbject [" परम "]। जोंसर्रे (5)" आदि
खेल

2
यह ध्यान रखना महत्वपूर्ण है कि आईडी और नाम गुणों के लिए बसने वालों को सार्वजनिक छोड़ दिया जाना चाहिए। यदि वे निजी या संरक्षित करने के लिए सेट किए गए हैं, तो डिसेरिएलाइज़ेशन त्रुटि के बिना निष्पादित होगा लेकिन सभी डेटा शून्य होगा।
इसहाक Zais

2
@sports, आप ऐसा कर सकते हैं कि C # में एक डायनेमिक को डिसेरलाइज़ करके, लेकिन यदि आप एक ज्ञात प्रकार के लिए डिसेररलाइज़ करते हैं तो प्रदर्शन बहुत बेहतर है।
PRMan

50

कभी-कभी मैं गतिशील वस्तुओं को पसंद करता हूं:

public JsonResult GetJson()
{
  string res;
  WebClient client = new WebClient();

  // Download string
  string value = client.DownloadString("https://api.instagram.com/v1/users/000000000/media/recent/?client_id=clientId");

  // Write values
  res = value;
  dynamic dyn = JsonConvert.DeserializeObject(res);
  var lstInstagramObjects = new List<InstagramModel>();

  foreach(var obj in dyn.data)
  {
    lstInstagramObjects.Add(new InstagramModel()
    {
      Link = (obj.link != null) ? obj.link.ToString() : "",
      VideoUrl = (obj.videos != null) ? obj.videos.standard_resolution.url.ToString() : "",
      CommentsCount = int.Parse(obj.comments.count.ToString()),
      LikesCount = int.Parse(obj.likes.count.ToString()),
      CreatedTime = new System.DateTime(1970, 1, 1, 0, 0, 0, 0).AddSeconds((double.Parse(obj.created_time.ToString()))),
      ImageUrl = (obj.images != null) ? obj.images.standard_resolution.url.ToString() : "",
      User = new InstagramModel.UserAccount()
             {
               username = obj.user.username,
               website = obj.user.website,
               profile_picture = obj.user.profile_picture,
               full_name = obj.user.full_name,
               bio = obj.user.bio,
               id = obj.user.id
             }
    });
  }

  return Json(lstInstagramObjects, JsonRequestBehavior.AllowGet);
}

एक बार एक उदाहरण का उदाहरण जहां यह उपयोगी था जब मैं जिस वस्तु को
हटाने की

2
एक स्पष्टीकरण क्रम में होगा।
पीटर मोर्टेंसन

@Icarus द्वारा स्वीकृत उत्तर पर आप इसे क्यों पसंद करेंगे?
प्रश्न

@ मजबूत, मजबूत प्रकार के वर्गों के लिए deserialising किसी भी गुण है कि अपनी कक्षाओं में नहीं थे की उपेक्षा करेंगे, जबकि गतिशील वस्तुओं के लिए deserialising बस गतिशील वापस आ जाएगा। इन वर्गों को अद्यतन करने की आवश्यकता के बिना भविष्य में बनाई गई किसी भी नई संपत्ति के लिए लचीला। (जैसा कि मैंने कहा, कभी-कभी मानक नहीं)
बिशो हैना

39

आपके लिए इन कक्षाओं को स्वचालित रूप से जेनरेट करने का एक शानदार तरीका यह है कि आप अपने JSON आउटपुट को कॉपी करें और इसे यहां फेंकें:

http://json2csharp.com/

यह आपको डीरियलाइज़ेशन के लिए अपनी कक्षाओं को छूने के लिए एक शुरुआती बिंदु प्रदान करेगा।


28

बहुत आसानी से हम JSON कंटेंट को डिक्शनरी और JavaScriptSerializer की मदद से पार्स कर सकते हैं। यहाँ नमूना कोड दिया गया है जिसके द्वारा मैं JSON सामग्री को एक ashx फ़ाइल से पार्स करता हूँ।

var jss = new JavaScriptSerializer();
string json = new StreamReader(context.Request.InputStream).ReadToEnd();
Dictionary<string, string> sData = jss.Deserialize<Dictionary<string, string>>(json);
string _Name = sData["Name"].ToString();
string _Subject = sData["Subject"].ToString();
string _Email = sData["Email"].ToString();
string _Details = sData["Details"].ToString();

3
यह समाधान बहुत उपयोगी है यदि आपके पास डेटा अनुबंध बनाने के लिए समय या आवश्यकता नहीं है। विशेष रूप से यदि आप केवल कुछ विशेषताओं में रुचि रखते हैं, जो JSON संरचना में गहरे दबे हुए हैं। उस स्थिति में आप क्या जरूरत है नेविगेट करने के लिए बयानों की एक श्रृंखला का उपयोग कर सकते हैं। नोट: डिसेरिएलाइज़ करने का प्रकार भी निम्न में से एक हो सकता है: शब्दकोश <string, object> या ArrayList (जब किसी नोड में दोहराई जाने वाली संरचना होती है)।
फिलिप मोनेट

1
मुझे इसके साथ एक रन टाइम अपवाद मिलता है: कोड के Deserialize लाइन पर 'System.String' के प्रकार के लिए कोई भी पैरामीटर रहित कंस्ट्रक्टर को परिभाषित नहीं किया गया है।
RSK

20

Newtonsoft.JSONइस तरह की स्थितियों के लिए एक अच्छा समाधान है। इसके अलावा Newtonsof.JSONतेजी से इस तरह के रूप में दूसरों की तुलना में है JavaScriptSerializer, DataContractJsonSerializer

इस नमूने में, आप निम्नलिखित कर सकते हैं:

var jsonData = JObject.Parse("your JSON data here");

तब आप jsonData को कास्ट कर सकते हैं JArray, और आप forप्रत्येक पुनरावृत्ति पर डेटा प्राप्त करने के लिए एक लूप का उपयोग कर सकते हैं ।

इसके अलावा, मैं कुछ जोड़ना चाहता हूं:

for (int i = 0; (JArray)jsonData["data"].Count; i++)
{
    var data = jsonData[i - 1];
}

डायनेमिक ऑब्जेक्ट के साथ काम करना और न्यूटनसॉफ्ट सीरीज़ का उपयोग करना एक अच्छा विकल्प है।


15

मैं इकारस के साथ सहमत हूं (अगर मैं कर सकता था तो टिप्पणी की होगी), लेकिन इसके बजाय एक कस्टमऑब्जेक्ट क्लास का उपयोग करने के बजाय , मैं एक डिक्शनरी का उपयोग करूंगा (यदि फेसबुक कुछ जोड़ता है)।

private class MyFacebookClass
{
    public IList<IDictionary<string, string>> data { get; set; }
}

या

private class MyFacebookClass
{
    public IList<IDictionary<string, object>> data { get; set; }
}

3
नए संस्करणों में गतिशील कार्यों का बेहतर उपयोग करना। public IList<IDictionary<string, dynmaic>> data { get; set; }
BJury

3

क्रमबद्धता:

// Convert an object to JSON string format
string jsonData = JsonConvert.SerializeObject(obj);

Response.Write(jsonData);

देशीकरण :

किसी गतिशील वस्तु को निष्क्रिय करने के लिए

  string json = @"{
      'Name': 'name',
      'Description': 'des'
    }";

var res = JsonConvert.DeserializeObject< dynamic>(json);

Response.Write(res.Name);

3

आप इस एक्सटेंशन का उपयोग कर सकते हैं

public static class JsonExtensions
{
   public static T ToObject<T>(this string jsonText)
   {
       return JsonConvert.DeserializeObject<T>(jsonText);
   }

   public static string ToJson<T>(this T obj)
   {
       return JsonConvert.SerializeObject(obj);
   }
}

1

यहाँ एक और साइट है जो आपको आवश्यक सभी कोड के साथ मदद करेगी जब तक आपके पास एक सही ढंग से तैयार JSON स्ट्रिंग उपलब्ध है:

https://app.quicktype.io/


1

यदि आप .NET कोर 3.0 का उपयोग कर रहे हैं , तो आप JSON को डीरिशियल करने के लिए System.Text.Json (जो अब अंतर्निहित है) का उपयोग कर सकते हैं ।

पहला कदम JSON को मॉडल बनाने के लिए कक्षाएं बनाना है। कई उपकरण हैं जो इसके साथ मदद कर सकते हैं, और यहां कुछ उत्तर उन्हें सूचीबद्ध करते हैं।

कुछ विकल्प http://json2csharp.com , http://app.quicktype.io हैं , या विज़ुअल स्टूडियो का उपयोग करें (मेनू संपादित करेंपेस्ट स्पेशलJSON को कक्षाओं के रूप में पेस्ट करें )।

public class Person
{
    public string Id { get; set; }
    public string Name { get; set; }
}

public class Response
{
    public List<Person> Data { get; set; }
}

तो आप का उपयोग कर deserialize कर सकते हैं:

var people = JsonSerializer.Deserialize<Response>(json);

यदि आपको सेटिंग्स को जोड़ने की आवश्यकता है, जैसे कि camelCaseहैंडलिंग, तो इस तरह से deserializer में धारावाहिक सेटिंग्स पास करें:

var options = new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase };
var person = JsonSerializer.Deserialize<Response>(json, options);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.