জসন.এন.টি. ব্যবহার করে জেসন অবজেক্টটিকে গতিশীল অবজেক্টে ডেসিরিয়াল করুন


426

Json.net ব্যবহার করে কোনও জসন ডিসরিয়ালাইজেশন থেকে গতিশীল কোনও বস্তু ফেরানো কি সম্ভব? আমি এই জাতীয় কিছু করতে চাই:

dynamic jsonResponse = JsonConvert.Deserialize(json);
Console.WriteLine(jsonResponse.message);

1
JSON json2csharp.com থেকে সি # ক্লাস উত্পন্ন করার বিষয়ে বিবেচনা করুন এবং গতিশীলের পরিবর্তে উত্পন্ন শ্রেণি ব্যবহার করুন
মাইকেল ফ্রেইজিম


আপনি কীভাবে স্ট্যাকওভারফ্লোটিকে "খুব পুরানো" হিসাবে কোনও প্রশ্ন বন্ধ করার পরামর্শ দিচ্ছেন? এটি ছয় বছর হয়েছে, তারপরে। নেট এর প্রতিটি সংস্করণের জন্য বৈধ উত্তর এবং যুক্তিসঙ্গত পরামর্শ রয়েছে ... এতগুলি যে তারা আর কোনও সহায়ক হয় না।
অ্যান্ড্রু লরিয়ান

উত্তর:


546

Json.NET আমাদের এটি করতে দেয়:

dynamic d = JObject.Parse("{number:1000, str:'string', array: [1,2,3,4,5,6]}");

Console.WriteLine(d.number);
Console.WriteLine(d.str);
Console.WriteLine(d.array.Count);

আউটপুট:

 1000
 string
 6

ডকুমেন্টেশন এখানে: জেসসন.এনইটের সাথে লিনকু থেকে জেএসএন

আরও দেখুন JObject.Parse এবং JArray.Parse


36
নোট করুন যে অ্যারেগুলির জন্য সিনট্যাক্সটি JArray.Parse
jgillich

4
কেন আমাদের গতিশীল শব্দটি ব্যবহার করা দরকার? আমি এর আগে কখনও ভয় পেয়েছি: ডি
মনস্টার এমএমআরপিজি

3
Dim d As Object = JObject.Parse("{number:1000, str:'string', array: [1,2,3,4,5,6]}")
ভিবি.নেটে

2
@ মনস্টার এমএমওরপিজি আপনার হওয়া উচিত :) ডায়নামিক প্রায় প্রতিটি পরিস্থিতিতে একটি বিরোধী নিদর্শন, তবে, এখন এবং পরে, আপনার কোনও পরিস্থিতি এটি ব্যবহার করার পক্ষে যুক্তিসঙ্গত হতে পারে।
প্লাচ

4
নিউটনসফট.জসন ৮.০.৩ (.NET 4.5.2) সহ: মাইক্রোসফ্ট.সিএসআরপি। রুনটাইমবাইন্ডার.রুনটাইমবাইন্ডার এক্সসেপশন ঘটেছে এইচআরসাল্ট = -2146233088 বার্তা = 'নিউটোনসফট.জসন.লিনক.জেঅবজেক্ট' 'সংখ্যার' জন্য সংজ্ঞা নেই উত্স = মাইক্রোসফ্ট .সিএসআরএপ স্ট্যাকট্রেস: মাইক্রোসফ্ট.সিএসআরপি.রুনটাইমবাইন্ডার.রুনটাইমবাইন্ডার কন্ট্রোলারস্মিবিট ইরার (সিআরর পিরর)
ইউজার 4698855

107

Json.NET 4.0 রিলিজ 1 হিসাবে, দেশীয় গতিশীল সমর্থন রয়েছে:

[Test]
public void DynamicDeserialization()
{
    dynamic jsonResponse = JsonConvert.DeserializeObject("{\"message\":\"Hi\"}");
    jsonResponse.Works = true;
    Console.WriteLine(jsonResponse.message); // Hi
    Console.WriteLine(jsonResponse.Works); // True
    Console.WriteLine(JsonConvert.SerializeObject(jsonResponse)); // {"message":"Hi","Works":true}
    Assert.That(jsonResponse, Is.InstanceOf<dynamic>());
    Assert.That(jsonResponse, Is.TypeOf<JObject>());
}

এবং, অবশ্যই, বর্তমান সংস্করণটি পাওয়ার সেরা উপায় হ'ল নুগেট।

মন্তব্যগুলিতে সম্বোধন করতে আপডেট হয়েছে (11/12/2014):

এটি পুরোপুরি সূক্ষ্ম কাজ করে। আপনি যদি ডিবাগারের টাইপটি পরীক্ষা করেন তবে দেখবেন মানটি আসলে গতিশীলঅন্তর্নিহিত টাইপ একটি হল JObject। আপনি যদি টাইপটি নিয়ন্ত্রণ করতে চান (যেমন উল্লেখ করা ExpandoObject, তবে এটি করুন)।

এখানে চিত্র বর্ণনা লিখুন


20
এটি কখনও কাজ করে বলে মনে হয় না। এটি কেবল একটি জবজেক্ট ফেরত দেয়, গতিশীল পরিবর্তনশীল নয়।
পল

12
বিটিডাব্লু, এটি কাজ করে: জসনকনভার্ট.ডিজরিয়ালাইজ অবজেক্ট <এক্সপান্ডোঅবজেক্ট> (STRING); সঠিক deserialization সঙ্গে, তাই আমরা JObject ইত্যাদি হবে না
Gutek

2
@ গুটেক আপনার সমস্যাটি কী তা নিশ্চিত নয়। আপনি কোড চালাবেন? আমি পরীক্ষায় জোর যুক্ত করেছি এবং একটি সম্পত্তি যুক্ত করেছি মূল জসনটিতে নয়। ডিবাগারের স্ক্রিনশট অন্তর্ভুক্ত।
ডেভিড পেডেন

1
@ ডেভিডপেডেন যদি আপনার জবজেক্ট থাকে এবং আপনি এটি রেজার সাথে আবদ্ধ করার চেষ্টা করবেন আপনি ব্যতিক্রম পাবেন। প্রশ্নটি ডায়নামিক অবজেক্টে ডিসেরায়ালাইজিংয়ের বিষয়ে ছিল - JObject ডায়নামিক তবে এতে JValue এর মতো "নিজস্ব" টাইপ রয়েছে আদিম ধরণের নয়। @Model.Propযদি রিটার্নের ধরনটি JValue হয় তবে আমি রেজারে নাম ব্যবহার করতে পারি না ।
গুটেক

2
এটি কাজ করে তবে প্রতিটি গতিশীল সম্পত্তি হ'ল একটি JValue। যা আমাকে বিভ্রান্ত করেছে কারণ আমি ডিবাগার / তাত্ক্ষণিক উইন্ডোতে কাজ করছিলাম এবং কেবলমাত্র দেখতে পাচ্ছিলাম না string। ডেভিড নীচের স্ক্রিনশটে এটি দেখায়। JValueরূপান্তরযোগ্য যাতে আপনি কেবল এটি করতে পারেনstring m = jsonResponse.message
লুক পুপলেট

66

আপনি যদি কেবল গতিশীল করার জন্য ডিজিটালাইজ করেন তবে আপনি একটি জবজেক্ট ফিরে পাবেন। আপনি একটি ExpandoObject ব্যবহার করে যা চান তা পেতে পারেন।

var converter = new ExpandoObjectConverter();    
dynamic message = JsonConvert.DeserializeObject<ExpandoObject>(jsonString, converter);

1
ফলাফলটি
অভিধানেও

1
ঠিক আমি যা চেয়েছিলাম! ধন্যবাদ!
ডার্কডেনি

42

আমি জানি এটি পুরানো পোস্ট তবে জসনকনভার্টের আসলে একটি আলাদা পদ্ধতি রয়েছে তাই এটি হবে

var product = new { Name = "", Price = 0 };
var jsonResponse = JsonConvert.DeserializeAnonymousType(json, product);

23
এটি কোনও গতিশীল প্রকার নয়, একটি জেনসন পেডলোডকে একটি বেনামে টাইপ করে ডিজিজারাইজ করা হবে। নামবিহীন প্রকার এবং গতিশীল ধরণগুলি বিভিন্ন জিনিস এবং আমি বিশ্বাস করি না যে এটি জিজ্ঞাসা করা প্রশ্নগুলির ঠিকানাগুলি।
জ্রিস্টা

1
এটি দুটি ভেরিয়েবল ব্যবহার করা প্রয়োজন? দ্বিতীয় বিবৃতিতে প্রথমটিকে কেন পুনরায় ব্যবহার করবেন না?
রেনিপেট

21

হ্যাঁ আপনি এটি জাসনকনভার্ট.ডিজরিয়ালাইজ অবজেক্ট ব্যবহার করে করতে পারেন। এটি করতে, কেবল সহজ কাজ করুন:

dynamic jsonResponse = JsonConvert.DeserializeObject(json);
Console.WriteLine(jsonResponse["message"]);

1
JsonConvertবলা একটি পদ্ধতি থাকে না Deserialize
পোয়েরাজোলু

এটি কেবল
DeserializeObject

21

দ্রষ্টব্য: ২০১০ সালে আমি এই প্রশ্নের উত্তর দিয়েছিলাম এমন সময়ে, কোনও প্রকারের ছাড়াই ডিজিটালাইজেশন করার কোনও উপায় ছিল না, এটি আপনাকে প্রকৃত শ্রেণীর সংজ্ঞা না দিয়েই deserialization করার অনুমতি দেয় এবং একটি বেনাম শ্রেণিকে deserialization করার জন্য ব্যবহার করার অনুমতি দেয়।


ডিসরিয়ালাইজ করার জন্য আপনার কিছু প্রকারের দরকার। আপনি এর লাইনে কিছু করতে পারেন:

var product = new { Name = "", Price = 0 };
dynamic jsonResponse = JsonConvert.Deserialize(json, product.GetType());

আমার উত্তরটি JSON সিরিয়ালাইজারে .NET 4.0 এর বিল্ডের সমাধানের উপর ভিত্তি করে। বেনামে ধরণের ডিসেরায়ালাইজ করার লিঙ্কটি এখানে:

http://blogs.msdn.com/b/alexghi/archive/2008/12/22/using-anonymous-types-to-deserialize-json-data.aspx


আমি আপনাদের সাথে আছি ফিল আমি জানি না কেন লোকেরা এটিকে নিচে ভোট দিচ্ছে, যদি কেউ দয়া করে পারেন .. দয়া করে কেন ব্যাখ্যা করবেন?
পিইও

18
এগুলি নিম্নমানের কারণ প্রশ্নটি কোনও প্রকার ছাড়াই deserialization সম্পর্কিত।
রিচার্ড 4 ই

4
২০১০ সালে এটি লেখার সময় উত্তরটি বৈধ ছিল যখন অন্য কোনও সমাধান ছিল না। এটি JSON.NET এ সমর্থন না আসা পর্যন্ত অল্প সময়ের জন্য এটি গ্রহণযোগ্য উত্তরও ছিল।
ফিল করুন

1
এটি কোনও গতিশীল অবজেক্ট তৈরি করে না। এটি এমন একটি জবজেক্ট তৈরি করে যা আপনি গতিশীল হিসাবে উল্লেখ করেন। তবে এটি এখনও ভিতরে একটি জবজেক্ট।
ghostbust555

5

আপনি যদি পুরানো সংস্করণ সহ JSON.NET ব্যবহার করেন যা জবজেক্ট করেনি।

এটি জেএসএন থেকে ডায়নামিক অবজেক্ট তৈরি করার অন্য একটি সহজ উপায়: https://github.com/chsword/jdynamic

নিউগেট ইনস্টল করুন

PM> Install-Package JDynamic

সদস্যদের অ্যাক্সেস করতে স্ট্রিং সূচক ব্যবহার করে সমর্থন করুন:

dynamic json = new JDynamic("{a:{a:1}}");
Assert.AreEqual(1, json["a"]["a"]);

পরীক্ষা ক্ষেত্রে

এবং আপনি এই ব্যবহারটি নিম্নলিখিত হিসাবে ব্যবহার করতে পারেন:

সরাসরি মান পান

dynamic json = new JDynamic("1");

//json.Value

২.জসন বস্তুতে সদস্যটি পান

dynamic json = new JDynamic("{a:'abc'}");
//json.a is a string "abc"

dynamic json = new JDynamic("{a:3.1416}");
//json.a is 3.1416m

dynamic json = new JDynamic("{a:1}");
//json.a is integer: 1

3.IEnumerable

dynamic json = new JDynamic("[1,2,3]");
/json.Length/json.Count is 3
//And you can use json[0]/ json[2] to get the elements

dynamic json = new JDynamic("{a:[1,2,3]}");
//json.a.Length /json.a.Count is 3.
//And you can use  json.a[0]/ json.a[2] to get the elements

dynamic json = new JDynamic("[{b:1},{c:1}]");
//json.Length/json.Count is 2.
//And you can use the  json[0].b/json[1].c to get the num.

অন্যান্য

dynamic json = new JDynamic("{a:{a:1} }");

//json.a.a is 1.

2

হ্যা এটা সম্ভব. আমি সব সময় যে করা হয়েছে।

dynamic Obj = JsonConvert.DeserializeObject(<your json string>);

অ দেশীয় টাইপের জন্য এটি কিছুটা কৌশলযুক্ত। ধরুন আপনার ওবজের ভিতরে একটি ক্লাসএ এবং ক্লাসবি অবজেক্ট রয়েছে। তারা সবাই জবজেক্টে রূপান্তরিত হয়েছে। আপনার যা করা দরকার তা হ'ল:

ClassA ObjA = Obj.ObjA.ToObject<ClassA>();
ClassB ObjB = Obj.ObjB.ToObject<ClassB>();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.