Прежде всего, поскольку я понятия не имею, насколько велик ваш json, и поскольку вы хотите анализировать только определенную часть самого json, я бы рекомендовал вам использовать JsonReader.class вместо JsonObject.class .
Короткая разница:
- JsonObject анализирует весь json в ОЗУ и должен быть меньше 1 МБ.
- JsonReader использует потоковый подход, который позволяет более эффективно обрабатывать большие jsons.
Во-вторых, если вы знаете, что вам ВСЕГДА нужен только первый экземпляр вашего json, вы можете просто сократить саму вашу jsonString перед ее синтаксическим анализом (например, substring
и т. Д.).
Теперь к вашему коду:
public static void getData (String s) выдает Exception {String urlBase = new String (theWebSiteImGettingDataFrom) ; // Точка с запятой!URL targetURL = новый URL (urlBase);URLConnection yc = targetURL.openConnection ();BufferedReader in = new BufferedReader (new InputStreamReader (yc.getInputStream ()));String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println(inputLine);
} // end while
in.close();
System.out.println("My json: "+inputLine); //TODO: What is your output here?
JSONObject obj = new JSONObject(inputLine);
double eps = obj.getJSONObject("earnings").getDouble("actualEPS");
System.out.println("This is the first instance of EPS: " + eps);
} // конец метода getData
Пожалуйста, прокомментируйте, поскольку я не могу сказать, получаете ли вы json с вашего сервера.
РЕДАКТИРОВАТЬ: Ваша ошибка в этой строке:
double eps = obj.getJSONObject("earnings").getDouble("actualEPS");
Короче это должно быть так:
double eps = obj.getJSONArray("earnings").getJSONObject(0).getDouble("actualEPS");
Но почему?Ваш доход атрибута возвращает JSONArray (что означает, что у вас есть несколько строк с индексами)Таким образом, вместо того, чтобы просто запрашивать «заработок» как JSONObject, вы должны использовать его как JSONArray, а затем извлечь первую строку (= .getJSONObject(0)
).После извлечения первой строки вы можете использовать ваше двойное значение.
Надеюсь, это сработает:)
2nd Edit: Измените это ..
while ((inputLine = in.readLine ())! = null) {
System.out.println(inputLine); } // end while
to:
while ((inputLine + = in.readLine ())! = null) {
System.out.println(inputLine); } // end while
Ваш цикл while продолжает повторяться , пока .readLine()
не вернет null .Так как null - это последняя итерация, в вашей переменной есть только null.
Как и предполагалось, вы можете решить это, просто изменив = на + = .
Надеюсь, мы получили это сейчас.:)