يمكن أن تحتوي استجابة JSON Parse على كائن أو عدة كائنات

StackOverflow https://stackoverflow.com/questions/4052250

  •  27-09-2019
  •  | 
  •  

سؤال

أحتاج إلى تحليل هذا الرد في Android باستخدام محلل Android JSON ولكن الشيء الذي لا يمكنني العثور عليه هو الإجابة على أي مكان هو:

كيف يمكنني تحليل البيانات إذا كان على سبيل المثال "مسارات" يمكن أن تحتوي على واحدة أو في بعض الأحيان كائنات من خط سير الرحلة؟ إذا كان يحتوي على واحد أكثر مما تم إرجاعه على هذا النحو ، ولكن إذا كان يحتوي على المزيد ، فسيتم إرجاعه مع [] مع هذا المثال "خط سير الرحلة" في jsonarray ، من الواضح أنه ليس صفيفًا. (لم توضع في [] أليس كذلك؟)

كيف يمكنني تحليل هذا؟ أي أمثلة؟

  {
   "plan":{
      "date":"2010-10-20T00:00:00+02:00",
      "from":{
         "name":"Булевар Партизански Одреди",
         "stopId":"123",
         "lon":"21.373255285035548",
         "lat":"42.00736515785779",
         "geometry":"{\"type\": \"Point\", \"coordinates\": [21.373255285035548,42.00736515785779]}"
      },
      "to":{
         "name":"Булевар Партизански Одреди",
         "stopId":"123",
         "lon":"21.37228809181389",
         "lat":"42.00762790595865",
         "geometry":"{\"type\": \"Point\", \"coordinates\": [21.37228809181389,42.00762790595865]}"
      },
      "itineraries":{
         "itinerary":{
            "duration":"159000",
            "startTime":"2010-10-20T00:00:00+02:00",
            "endTime":"2010-10-20T00:02:39+02:00",
            "walkTime":"159000",
            "transitTime":"0",
            "waitingTime":"0",
            "walkDistance":"212.6496008849819",
            "elevationLost":"0.0",
            "elevationGained":"0.0",
            "transfers":"0",
            "legs":{
               "leg":{
                  "@route":"Булевар Партизански Одреди",
                  "@mode":"WALK",
                  "startTime":"2010-10-20T00:00:00+02:00",
                  "endTime":"2010-10-20T00:02:39+02:00",
                  "distance":"212.6496008849819",
                  "from":{
                     "name":"Булевар Партизански Одреди",
                     "lon":"21.373255285035548",
                     "lat":"42.00736515785779",
                     "geometry":"{\"type\": \"Point\", \"coordinates\": [21.373255285035548,42.00736515785779]}"
                  },
                  "to":{
                     "name":"Булевар Партизански Одреди",
                     "lon":"21.37228809181389",
                     "lat":"42.00762790595865",
                     "geometry":"{\"type\": \"Point\", \"coordinates\": [21.37228809181389,42.00762790595865]}"
                  },
                  "legGeometry":{
                     "length":"3",
                     "points":"_qk_GymmaCf@qC{ArI"
                  },
                  "steps":{
                     "walkSteps":{
                        "distance":"212.6496008849819",
                        "streetName":"Булевар Партизански Одреди",
                        "absoluteDirection":"EAST",
                        "stayOn":"false",
                        "becomes":"false",
                        "lon":"21.373255285035548",
                        "lat":"42.00736515785779",
                        "elevation":""
                     }
                  },
                  "duration":"159000"
               }
            },
            "tooSloped":"false"
         }
      }
   },
   "requestParameters":{
      "entry":[
         {
            "key":"optimize",
            "value":"QUICK"
         },
         {
            "key":"time",
            "value":"9:40 am\""
         },
         {
            "key":"wheelchair",
            "value":"false"
         },
         {
            "key":"maxWalkDistance",
            "value":"800.0"
         },
         {
            "key":"fromPlace",
            "value":"42.0074711701039,21.3732840843651"
         },
         {
            "key":"toPlace",
            "value":"42.0076745404488,21.3723007605583"
         },
         {
            "key":"date",
            "value":"10/20/2010"
         },
         {
            "key":"mode",
            "value":"TraverseMode (WALK, TRAM, SUBWAY, RAIL, BUS, FERRY, CABLE_CAR, GONDOLA, FUNICULAR, TRANSIT, TRAINISH, BUSISH)"
         },
         {
            "key":"numItineraries",
            "value":"3"
         }
      ]
   }
}

هذا ما أستخدمه للجزء الأول

JSONObject planObject=json.getJSONObject("plan");
            Log.i("date",planObject.get("date").toString());

            JSONObject fromObject=planObject.getJSONObject("from");
            Log.i("from object",fromObject.get("name").toString());
            Log.i("from object",fromObject.get("stopId").toString());
            Log.i("from object",fromObject.get("lon").toString());
            Log.i("from object",fromObject.get("lat").toString());

هذا هو المثال الذي كتبه فيليكس وهو يدور حول "مسارات" متعددة

"itineraries": [
    {"duration": "123456", ... },
    {"duration": "789012", ... }
]

سيكون هذا هو نفس المثال ولكن لأحد:

"itineraries": 
{"duration": "123456", ... },

لذلك في الحالة الثانية ، لا يوجد jsonarray ، لذا إذا حاولت استخدام الكود الذي قدمه Felix لحلية صفيف ، فسوف يعيد خطأ.

لذا فإن السؤال هو: ما هي الطريقة للتحقق مما إذا كان يمكن وضع القيمة في jsonarray. هل القيادة optjsonarray ("possiBleArrayvalues")! = خالية مستخدمة أم أن هناك طريقة أفضل ثم القيام بالكثير من الشيكات إذا كانت؟

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

المحلول

لا أعتقد أنه قانوني للحصول على مفاتيح متعددة مع نفس الاسم في كائن JSON. أي المفاتيح في كائن JSON يجب أن تشكل أ تعيين, ، ليست قائمة.

هل يمكنك نشر مثال عندما يكون هناك المزيد من مسارات؟ أراهن أنه سيبدو مثل:

...
"itineraries": [
    {"duration": "123456", ... },
    {"duration": "789012", ... }
]
...

لو أنه يفعل يبدو هكذا ، تحليله سهل:

JSONArray itineraries = planObject.getJSONArray("itineraries");
for (int i=0; i < itineraries.length(); i++) {
    Log.i("TAG", itineraries.getJSONObject(i).getString("duration");
}

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


يحرر: الآن بعد أن عرفنا كيف تبدو الاستجابة متعددة العناصر ، إليك كيفية تحليلها:

Object itineraries = planObject.get("itineraries");
if (itineraries instanceof JSONObject) {
    JSONObject itinerary = (JSONObject) itineraries;
    // right now, itinerary is your single item
}
else {
    JSONArray array = (JSONArray) itineraries;
    // do whatever you want with the array of itineraries
}

لم يخبر ، ولكن يجب أن يعمل.

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