c# - قم بإلغاء تسلسل كائن json في كائن ديناميكي باستخدام Json.net




(6)

هل من الممكن إرجاع كائن ديناميكي من إلغاء تسلسل json باستخدام 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

وثائق هنا: LINQ إلى JSON مع Json.NET


إذا كنت تستخدم JSON.NET مع الإصدار القديم الذي لم يكن JObject.

هذه طريقة بسيطة أخرى لعمل كائن ديناميكي من JSON: https://github.com/chsword/jdynamic

تثبيت NuGet

PM> Install-Package JDynamic

الدعم باستخدام فهرس السلسلة للوصول إلى أعضاء مثل:

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

حالة اختبار

ويمكنك استخدام هذا الاستخدام على النحو التالي:

احصل على القيمة مباشرة

dynamic json = new JDynamic("1");

//json.Value

2. احصل على العضو في كائن json

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.

اعتبارًا من الإصدار 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>());
}

وبالطبع ، فإن أفضل طريقة للحصول على الإصدار الحالي هي عن طريق NuGet.

تحديث (11/12/2014) لمعالجة التعليقات:

هذا يعمل بشكل جيد. إذا قمت بفحص النوع في مصحح الأخطاء سترى أن القيمة ، في الواقع ، ديناميكية . النوع الأساسي هو JObject . إذا كنت تريد التحكم في النوع (مثل تحديد ExpandoObject ، ExpandoObject ذلك.


نعم هذا ممكن. لقد كنت أفعل ذلك طوال الوقت.

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

انها اصعب قليلا بالنسبة لغير نوع الأم. افترض أن لديك داخل Class Obj ، كائنات ClassA و ClassB. يتم تحويل كلهم ​​إلى JObject. ما عليك القيام به هو:

ClassA ObjA = Obj.ObjA.ToObject<ClassA>();
ClassB ObjB = Obj.ObjB.ToObject<ClassB>();

وأنا أعلم أن هذا هو وظيفة قديمة ولكن JsonConvert في الواقع لديه طريقة مختلفة لذلك سيكون

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

ملاحظة: في الوقت الذي أجبت فيه عن هذا السؤال في عام 2010 ، لم تكن هناك طريقة للتسلط من دون نوع من أنواع الكتابة ، وهذا سمح لك بالتوقف عن العمل دون الحاجة إلى تحديد الطبقة الفعلية وسمحت باستخدام فئة مجهولة لفعل إلغاء التسلسل.

يجب أن يكون لديك نوع من أنواع إلغاء التسلسل. يمكنك فعل شيء على غرار ما يلي:

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

تعتمد إجابتي على حل لبناء .NET 4.0 في مسلسل JSON. رابط إلغاء التسلسل إلى أنواع مجهولة هو هنا:

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





json.net