Json.net ব্যবহার করে কোনও জসন ডিসরিয়ালাইজেশন থেকে গতিশীল কোনও বস্তু ফেরানো কি সম্ভব? আমি এই জাতীয় কিছু করতে চাই:
dynamic jsonResponse = JsonConvert.Deserialize(json);
Console.WriteLine(jsonResponse.message);
Json.net ব্যবহার করে কোনও জসন ডিসরিয়ালাইজেশন থেকে গতিশীল কোনও বস্তু ফেরানো কি সম্ভব? আমি এই জাতীয় কিছু করতে চাই:
dynamic jsonResponse = JsonConvert.Deserialize(json);
Console.WriteLine(jsonResponse.message);
উত্তর:
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
JArray.Parse
।
Dim d As Object = JObject.Parse("{number:1000, str:'string', array: [1,2,3,4,5,6]}")
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
, তবে এটি করুন)।
@Model.Prop
যদি রিটার্নের ধরনটি JValue হয় তবে আমি রেজারে নাম ব্যবহার করতে পারি না ।
JValue
। যা আমাকে বিভ্রান্ত করেছে কারণ আমি ডিবাগার / তাত্ক্ষণিক উইন্ডোতে কাজ করছিলাম এবং কেবলমাত্র দেখতে পাচ্ছিলাম না string
। ডেভিড নীচের স্ক্রিনশটে এটি দেখায়। JValue
রূপান্তরযোগ্য যাতে আপনি কেবল এটি করতে পারেনstring m = jsonResponse.message
আপনি যদি কেবল গতিশীল করার জন্য ডিজিটালাইজ করেন তবে আপনি একটি জবজেক্ট ফিরে পাবেন। আপনি একটি ExpandoObject ব্যবহার করে যা চান তা পেতে পারেন।
var converter = new ExpandoObjectConverter();
dynamic message = JsonConvert.DeserializeObject<ExpandoObject>(jsonString, converter);
আমি জানি এটি পুরানো পোস্ট তবে জসনকনভার্টের আসলে একটি আলাদা পদ্ধতি রয়েছে তাই এটি হবে
var product = new { Name = "", Price = 0 };
var jsonResponse = JsonConvert.DeserializeAnonymousType(json, product);
হ্যাঁ আপনি এটি জাসনকনভার্ট.ডিজরিয়ালাইজ অবজেক্ট ব্যবহার করে করতে পারেন। এটি করতে, কেবল সহজ কাজ করুন:
dynamic jsonResponse = JsonConvert.DeserializeObject(json);
Console.WriteLine(jsonResponse["message"]);
JsonConvert
বলা একটি পদ্ধতি থাকে না Deserialize
।
দ্রষ্টব্য: ২০১০ সালে আমি এই প্রশ্নের উত্তর দিয়েছিলাম এমন সময়ে, কোনও প্রকারের ছাড়াই ডিজিটালাইজেশন করার কোনও উপায় ছিল না, এটি আপনাকে প্রকৃত শ্রেণীর সংজ্ঞা না দিয়েই deserialization করার অনুমতি দেয় এবং একটি বেনাম শ্রেণিকে deserialization করার জন্য ব্যবহার করার অনুমতি দেয়।
ডিসরিয়ালাইজ করার জন্য আপনার কিছু প্রকারের দরকার। আপনি এর লাইনে কিছু করতে পারেন:
var product = new { Name = "", Price = 0 };
dynamic jsonResponse = JsonConvert.Deserialize(json, product.GetType());
আমার উত্তরটি JSON সিরিয়ালাইজারে .NET 4.0 এর বিল্ডের সমাধানের উপর ভিত্তি করে। বেনামে ধরণের ডিসেরায়ালাইজ করার লিঙ্কটি এখানে:
আপনি যদি পুরানো সংস্করণ সহ 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.
হ্যা এটা সম্ভব. আমি সব সময় যে করা হয়েছে।
dynamic Obj = JsonConvert.DeserializeObject(<your json string>);
অ দেশীয় টাইপের জন্য এটি কিছুটা কৌশলযুক্ত। ধরুন আপনার ওবজের ভিতরে একটি ক্লাসএ এবং ক্লাসবি অবজেক্ট রয়েছে। তারা সবাই জবজেক্টে রূপান্তরিত হয়েছে। আপনার যা করা দরকার তা হ'ল:
ClassA ObjA = Obj.ObjA.ToObject<ClassA>();
ClassB ObjB = Obj.ObjB.ToObject<ClassB>();