JSON Parse Responseは、1つまたは複数のオブジェクトを持つことができます

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

  •  27-09-2019
  •  | 
  •  

質問

Android JSONパーサーを使用してAndroidでこの応答を解析する必要がありますが、どこでも答えが見つからないことは次のとおりです。

たとえば、「旅程」がタイプの旅程の1つまたはそれ以上のオブジェクトを含めることができる場合、データを解析するにはどうすればよいですか?このように返されるよりも1つが含まれている場合、より多くが含まれている場合は、この例で「旅程」を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", ... }
]

これは同じ例ですが、1つは次のとおりです。

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

したがって、2番目のケースではjsonarrayがありませんので、解析配列に与えられたコードFelixを使用しようとすると、エラーが返されます。

質問は次のとおりです。jsonarrayに値を置くことができるかどうかを確認する方法は何ですか。コマンドはoptjsonarray(「possiblearrayvalues」)!= nullの使用されていますか、それとも多くのif-thenチェックを行うよりも良い方法がありますか?

役に立ちましたか?

解決

そうだとは思わない 法的 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");
}

そうでない場合、あなたが働いているAPIは壊れています。それを修正するか、それを修正するためにそれを実行する人を伝える:)


編集: 複数項目の応答がどのように見えるかがわかったので、それを解析する方法は次のとおりです。

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