সি # দিয়ে জেএসওনকে ডিসিজায়াল করুন


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);

এটি কাজ করছে না, কারণ আদিম বস্তুটি অবৈধ। আমি কীভাবে এটিকে deserialize করতে পারি?


3
এই জাতীয়
জসনকে পরিচর্যা

2
অথবা আপনি এটি ব্যবহার করতে পারেন Dictionary<string,string>: চেক আউট করুন: stackoverflow.com/questions/7699972/…
কাকাশি

9
আপনার বন্ধু: json2csharp.com
নওফাল

4
প্রকৃতপক্ষে ভিজ্যুয়াল স্টুডিওগুলি (2013 সালের হিসাবে বা 2012 সালে ওয়েব সরঞ্জাম ইনস্টল করা আছে) এর মধ্যে এই নির্ভুল কার্যকারিতাটি অন্তর্নির্মিত রয়েছে: সম্পাদনা> বিশেষ আটকান> ক্লাস হিসাবে
জেএসএন

উত্তর:


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
হ্যাঁ, আমি এটি করতে চাই না এটি, বাচ্চাদের ধরে রাখতে একটি নতুন অবজেক্ট তৈরি করুন। আমি মনে করি আমি জিমসনটি আদিম বস্তুটি বাইরে নিয়ে যাচ্ছি। ধন্যবাদ.

@ কেভিন হোল্ডিচ সংশোধনের জন্য ধন্যবাদ। আমি একটি গুরুত্বপূর্ণ বিট মিস করেছি :)
Icarus

2
আমি এই সিস্টেমটি সম্পর্কে যা পছন্দ করি না W ওয়েবে.সক্রিপ্ট.শিরাইজেশন.জবা স্ক্রিপ্টসিরাইজার () হ'ল আপনার সর্বদা একটি সংজ্ঞায়িত প্রকারের টি দরকার Java পরম "]। জেএসোনারে (5)" ইত্যাদি
স্পোর্টস

2
এটি লক্ষ করা জরুরী যে আইডি এবং নাম বৈশিষ্ট্যের জন্য সেটটারগুলি সর্বজনীন রেখে যেতে হবে। যদি সেগুলি বেসরকারী বা সুরক্ষিত করে সেট করা থাকে তবে deserialization ত্রুটি ছাড়াই কার্যকর করা হবে তবে সমস্ত ডেটা বাতিল হবে।
আইজাক জায়েস

2
@ স্পোর্টস, আপনি গতিশীলকে ডিসিরিয়ালাইজ করে সি # তে এটি করতে পারেন, তবে আপনি যদি কোনও পরিচিত ধরণের ডিজিটালাইজ করেন তবে পারফরম্যান্স আরও ভাল।
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
একটি ব্যাখ্যা ক্রম হবে।
পিটার মর্টেনসেন

আপনি কেন ইকারাসের গৃহীত উত্তরের চেয়ে এটিকে পছন্দ করবেন?
প্রশ্ন করা হচ্ছে

@ প্রশ্ন, শক্তিশালী ধরণের শ্রেণিতে deserialization আপনার শ্রেণীর মধ্যে নেই এমন কোনও সম্পত্তিকে অবহেলা করবে যখন গতিশীল বস্তুগুলির deserializing কেবল গতিশীল ফিরে আসবে N নেট বস্তুটি আপনার ক্লাসগুলি আপডেট করার প্রয়োজনীয়তা ছাড়াই ভবিষ্যতে তৈরি হওয়া কোনও নতুন সম্পত্তিতে নমনীয় ts (যেমনটি আমি বলেছি, কখনও কখনও স্ট্যান্ডার্ড নয়)
বিশ হান্না

38

আপনার জন্য এই ক্লাসগুলি স্বয়ংক্রিয়ভাবে উত্পন্ন করার একটি দুর্দান্ত উপায় হ'ল আপনার জেএসওএন আউটপুটটি অনুলিপি করুন এবং এটিকে এখানে ফেলে দিন:

http://json2csharp.com/

এটি আপনাকে ডিসেসরিয়ালের জন্য আপনার ক্লাসগুলিকে স্পর্শ করার একটি প্রাথমিক পয়েন্ট সরবরাহ করবে।


28

খুব সহজেই আমরা অভিধান এবং জাভাস্ক্রিপ্টসরিয়ালাইজারের সাহায্যে জেএসএন বিষয়বস্তু পার্স করতে পারি। এখানে নমুনা কোডটি রয়েছে যার দ্বারা আমি একটি অ্যাশএক্স ফাইল থেকে জেএসওএন বিষয়বস্তুকে পার্স করছি।

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 কাঠামোর গভীরে কবর দেওয়া কয়েকটি কয়েকটি বৈশিষ্ট্যে আগ্রহী হন। এই পরিস্থিতিতে আপনি যা প্রয়োজন তা নেভিগেট করতে বিবৃতিগুলির একটি সিরিজ ব্যবহার করতে পারেন। দ্রষ্টব্য: ডিজিটালাইজ করার ধরণটি নিম্নলিখিতগুলির মধ্যে একটিও হতে পারে: অভিধান <স্ট্রিং, অবজেক্ট> বা অ্যারেলিস্ট (যখন কোনও নোডের পুনরাবৃত্তি কাঠামো থাকে)।
ফিলিপ মনেট

1
আমি এটির সাথে একটি রান টাইম ব্যতিক্রম পাই: কোডের ডিসেরালাইজ লাইনে 'System.String' টাইপের জন্য কোনও প্যারামিটারলেস কনস্ট্রাক্টর সংজ্ঞায়িত হয়নি।
আরএসকে

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; }
বিজেউরি

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- র deserialize করতে 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; }
}

তারপরে আপনি এটি ব্যবহার করে ডিসরিয়ালাইজ করতে পারেন:

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

আপনার যদি camelCaseহ্যান্ডলিংয়ের মতো সেটিংস যুক্ত করতে হয় তবে ডিরিসালাইজারে সিরিয়ালাইজার সেটিংস এই জাতীয় পাস করুন:

var options = new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase };
var person = JsonSerializer.Deserialize<Response>(json, options);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.