2016-03-06 3 views
3

Я знаю, что есть повторяющиеся вопросы. Несмотря на это, я не могу это понять.Объект JSON не найден в массиве JSON

Ниже представлен файл JSON, который я получаю от API. Мне нужно получить значение «год».

Ошибка я получаю:

message org.glassfish.jersey.server.ContainerException: org.json.JSONException: JSONArray[1] not found.

Что касается линии на Java:

JSONObject year = years.getJSONObject(1).getJSONObject("years"); 

Я также попытался:

JSONObject year = years.getJSONObject(1); 

Почему этот код не работает ? Не index 1 ясно year в years массив?

JSON

{ 
    "make": { 
     "id": 200000404, 
     "name": "Chevrolet", 
     "niceName": "chevrolet" 
    }, 
    "model": { 
     "id": "Chevrolet_Camaro", 
     "name": "Camaro", 
     "niceName": "camaro" 
    }, 
    "drivenWheels": "rear wheel drive", 
    "numOfDoors": "2", 
    "options": [], 
    "colors": [], 
    "manufacturerCode": "1EH67", 
    "price": { 
     "baseMSRP": 34180.0, 
     "baseInvoice": 32813.0, 
     "deliveryCharges": 900.0, 
     "usedTmvRetail": 17766.0, 
     "usedPrivateParty": 16321.0, 
     "usedTradeIn": 14755.0, 
     "estimateTmv": false, 
     "tmvRecommendedRating": 0 
    }, 
    "categories": { 
     "market": "Performance", 
     "EPAClass": "Compact Cars", 
     "vehicleSize": "Midsize", 
     "primaryBodyType": "Car", 
     "vehicleStyle": "Convertible", 
     "vehicleType": "Car" 
    }, 
    "vin": "2G1FC3D33C9165616", 
    "squishVin": "2G1FC3D3C9", 
    "years": [{ 
     "id": 100531911, 
     "year": 2012, 
     "styles": [{ 
      "id": 101395591, 
      "name": "LT 2dr Convertible w/2LT (3.6L 6cyl 6M)", 
      "submodel": { 
       "body": "Convertible", 
       "modelName": "Camaro Convertible", 
       "niceName": "convertible" 
      }, 
      "trim": "LT" 
     }] 
    }], 
    "matchingType": "SQUISHVIN", 
    "MPG": { 
     "highway": "28", 
     "city": "17" 
    } 
} 

JAVA

public String vehicleData(@PathParam("vin") String vin, 
           @PathParam("key") String key) throws Exception { 

     GetVehicleJSON jsonData = new GetVehicleJSON(vin, key); 
     JSONObject data = jsonData.getVehicleData(); 

     String name = data.getJSONObject("make").getString("name"); 

     String highway = data.getJSONObject("MPG").getString("highway"); 
     String city = data.getJSONObject("MPG").getString("city"); 

     JSONArray years = data.getJSONArray("years"); 
     JSONObject year = years.getJSONObject(1).getJSONObject("years"); 
     String s = year.getString("year"); 

     return name + " " + s + " " + highway + " " + city; 
    } 
+1

Фактически, 1 указывает на второй элемент в массиве, которого в этом случае не существует. 0 указывает на первый JSONObject, который содержит год. Таким образом, вы хотите 'years.getJSONObject (0)'. – Ares

+1

Попробуйте 'JSONObject year = years.getJSONObject (0);'. Индексирование массива обычно начинается с '0', а не' 1'. –

+0

@ Джонатан Лоновски не является объектом «id» в индексе 0? – NutellaAddict

ответ

2

Ваш JSON показывает, что значение года является массивом с 1 элементом и внутри этого элемента объекта:

"years": [{ "id": 100531911, "year": 2012, "styles": [{ "id": 101395591, "name": "LT 2dr Convertible w/2LT (3.6L 6cyl 6M)", "submodel": { "body": "Convertible", "modelName": "Camaro Convertible", "niceName": "convertible" }, "trim": "LT" }] }], 

Поскольку нумерация элементов массива начинается с 0, это означает, что если вы выбираете элемент 1, вы получите эту ошибку:

message org.glassfish.jersey.server.ContainerException: org.json.JSONException: JSONArray[1] not found.

чтобы исправить это вам нужно выбрать элемент 0 вместо 1:

years.getJSONObject(0); 
3

Вы работаете с JSON массива, индексация начинается с нуля. Сделайте это как:

JSONArray years = data.getJSONArray("years"); 

    String year = years.getJSONObject(0).getString("year"); 
Смежные вопросы