سؤال

أحاول تحليل بنية JSON مماثلة لهذا:

    {
 "cars": {
  "112": {
   "make": "Cadillac",
   "model": "Eldorado",
   "year": "1998"
  },
  "642": {
   "make": "Cadillac",
   "model": "Eldorado",
   "year": "1990"
  },
  "9242": {
   "make": "Cadillac",
   "model": "Eldorado",
   "year": "2001"
  }
 }}

لدي فئة carentity محددة مع makename ، طراز ، سمات السنة المحددة ويمكن الوصول إليها عبر المستقدين/getters.

أحاول إلغاء تمييز هذا JSON مثل هذا:

    Map<String, CarEntity> deserialized = new JSONDeserializer<Map<String, CarEntity>>()
   .use("cars.values", Map.class)
   .deserialize(json);

وهو لا يعمل :( إنه لا يفرزه ولكن ليس في Map<String, CarEntity> ولكن في خريطة عميقة (شيء مثل Map<String, Map<String, Map<String, String>>> )

ما الخطأ الذي افعله؟

هل كانت مفيدة؟

المحلول

أنت مشكلة هي أن JSON لديك خريطتان. واحد الذي يحتوي على مفتاح "السيارات" ، والذي يحتوي على carentity الفعلي. لسوء الحظ ، لا يمكنك الرجوع إلى مفتاح واحد داخل الخريطة وتعيين أنواع على هذا المفتاح في هذا الوقت. بشكل عام يشير إعداد أنواع القيم للمجموعات إلى جميع القيم داخل المجموعة. لا تحتاج إلى تحديد الأنواع الخاصة بالخريطة الأولى التي تحتوي على مفتاح "Cars" لأنها ستستهلكها افتراضيًا.

Map<String, CarEntity> deserialized = new JSONDeserializer<Map<String,Map<String, CarEntity>>>()
    .use("values.values", CarEntity.class )
    .deserialize(json).get("cars");

يشير المسار "القيم. القيم" إلى قيم الخريطة الخارجية ثم اجتياز قيم الخريطة التالية كلها مثيلات carentity.

لقد فكرت في تغيير تعبيرات المسار ليكون أكثر تعبيراً مما يتيح لك استهداف قيمة واحدة في المجموعة ، لكن هذا يزيد من النفقات العامة لتقييمها والتوافق مع الخلف يمثل تحديًا.

نصائح أخرى

من المرجح أن تتعرض للعض بواسطة Java Type Erasure: مكتبة JSON المعنية لا تعرف النوع الذي تريده ؛ كل ما يراه يعادل الخريطة. لذلك يجب عليك تحديد نوع القيمة على الأقل بطريقة أو بأخرى. نأمل أن توثق Flexjson تشير إلى كيف.

بدلاً من ذلك ، قد تكون قادرًا على HashMap من الفئة الفرعية في النوع الخاص بك (MyentityMap يمتد HashMap) ، لأنه يمكن استنتاج المعلومات من النوع الفائق العام ؛ وتجاوز myentitymap.class من شأنه أن يعطي نوعًا ما يمكن أن تستخدمه معظم مكتبات JSON (Jackson و GSON على الأقل).

إذا لم تنجح هذه ، يمكن لمكتبات جاكسون و GSON التعامل مع حالة الاستخدام هذه بسهولة ؛ كلاهما لديه طرق لتحديد الأنواع العامة للتخلص.

فقط أضف مكالمة أخرى إلى get("cars") مثل:

Map<String, CarEntity> deserialized = new JSONDeserializer<Map<String, CarEntity>>()
   .use("cars.values", Map.class)
   .deserialize(json).get("cars");

ربما تم تسلسل سلسلة JSON من متغير cars كتبت Map<String, CarEntity>

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top