Newtonsoft.json: الوصول إلى الكائن الأصل في المحول

تم إنشاؤها على ١٨ ديسمبر ٢٠١٧  ·  3تعليقات  ·  مصدر: JamesNK/Newtonsoft.Json

مثال تجاوز سعة المكدس

؛ NewtonSoft JsonConverter - الوصول إلى خصائص أخرى

مشكلة

لا توجد طريقة للوصول إلى الكائن الأصل من JsonConverter. على سبيل المثال ، إذا كانت هناك حاجة لتغيير إخراج المحول الذي يعتمد على احتواء الكائن الذي يتم تسلسله. في حالة الاستخدام المحددة الخاصة بي ، أحتاج إلى تنسيق إخراج JSON لخاصية كسلسلة عملة ، تعتمد على
الثقافة التي يتم تخزينها داخل الكائن المحتوي.

على سبيل المثال

public class Contract {
   [JsonIgnore]
   public CultureInfo Culture {get; set;}

   [JsonConverter(typeof(CurrencyConverter))]
   public decimal Cost {get;set;}

   // Lots of additional properties with serialization controlled by attributes.
}

مع مجموعة من العقود ، سأحصل على JSON [{ Cost : "£5000.00"}, { Cost : "$8000.00"}, { Cost : "€599.00"}] التالي

الحل المقترح

قم بتعريض _serializerStack الخاص بـ JsonSerializeWriter باعتباره مجموعة ReadOnlyCollection كخاصية عامة على كائن جهاز التسلسل الذي تم تمريره إلى WriteJson.

التعليق الأكثر فائدة

JonHanna لأن هذا يعني أنك بحاجة إلى التعامل مع تحويل جميع الخصائص في الكائن المحتوي بدلاً من الاعتماد على السلوك الافتراضي باستخدام الخصائص.

أيضًا إذا كان لديك Contract مع العديد من Vendor s لكل منها العديد من Asset s وكان Asset يحتوي على حقل تكلفة يحتاج إلى تنسيق الإخراج اعتمادًا على ثقافة العقد يجب عليك كتابة محول لـ Contract الذي يقوم بعد ذلك بترتيب جميع الخصائص الفرعية. يؤدي ذلك إلى إنشاء الكثير من التعليمات البرمجية الإضافية للمحول حيث يمكن لمحول بسيط السير في شجرة التسلسل للعثور على تلك الثقافة وتنسيق الإخراج.

ستكون كائنات DTO نظيفة نسبيًا مع سمات تحدد سلوكها وسيكون المحول أيضًا بسيطًا نسبيًا دون الحاجة إلى تعيين جميع الخصائص الإضافية.

لقد عملت باستخدام الانعكاس لاستدعاء GetInternalSerializer() على JsonSerializer الذي تم تمريره ثم استرداد الحقل _serializerStack الخاص. كل ما تحتاجه هو JsonSerializerInternalWriter لعرض حقل "_serializerStack" كخاصية يمكن أن يعرضها JsonSerializer أيضًا. اقتراحي هو كشفها كمجموعة للقراءة فقط لحماية الأجزاء الداخلية.

ال 3 كومينتر

إذا كان إخراج المحول يعتمد على النوع المحتوي ، فلماذا لا يكون النوع المحتوي هو ما يتم تحويله؟

JonHanna لأن هذا يعني أنك بحاجة إلى التعامل مع تحويل جميع الخصائص في الكائن المحتوي بدلاً من الاعتماد على السلوك الافتراضي باستخدام الخصائص.

أيضًا إذا كان لديك Contract مع العديد من Vendor s لكل منها العديد من Asset s وكان Asset يحتوي على حقل تكلفة يحتاج إلى تنسيق الإخراج اعتمادًا على ثقافة العقد يجب عليك كتابة محول لـ Contract الذي يقوم بعد ذلك بترتيب جميع الخصائص الفرعية. يؤدي ذلك إلى إنشاء الكثير من التعليمات البرمجية الإضافية للمحول حيث يمكن لمحول بسيط السير في شجرة التسلسل للعثور على تلك الثقافة وتنسيق الإخراج.

ستكون كائنات DTO نظيفة نسبيًا مع سمات تحدد سلوكها وسيكون المحول أيضًا بسيطًا نسبيًا دون الحاجة إلى تعيين جميع الخصائص الإضافية.

لقد عملت باستخدام الانعكاس لاستدعاء GetInternalSerializer() على JsonSerializer الذي تم تمريره ثم استرداد الحقل _serializerStack الخاص. كل ما تحتاجه هو JsonSerializerInternalWriter لعرض حقل "_serializerStack" كخاصية يمكن أن يعرضها JsonSerializer أيضًا. اقتراحي هو كشفها كمجموعة للقراءة فقط لحماية الأجزاء الداخلية.

أود أن أتطرق إلى هذا ، حيث يبدو أن الانعكاس في المسلسل لا يزال هو السبيل الوحيد للوصول إلى مكدس التسلسل.
أم أن هناك طريقة أخرى الآن؟

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات