Разобрать JSON для первого экземпляра повторяющегося поля данных в Java с помощью org.JSON - PullRequest
0 голосов
/ 30 сентября 2018

Я пытаюсь проанализировать первый экземпляр «actualEPS» из следующего файла JSON:

   {"symbol":"AAPL","earnings":[{"actualEPS":2.34,"consensusEPS":2.17,"estimatedEPS":2.17,"announceTime":"AMC","numberOfEstimates":10,"EPSSurpriseDollar":0.17,"EPSReportDate":"2018-07-31","fiscalPeriod":"Q3 2018","fiscalEndDate":"2018-06-30","yearAgo":1.67,"yearAgoChangePercent":0.40119760479041916,"estimatedChangePercent":0.29940119760479045,"symbolId":11},{"actualEPS":2.73,"consensusEPS":2.69,...}

Вот метод в настоящее время.Я знаю, что я получаю данные от цели, так как я могу Sysout String "inputLine" и посмотреть полный файл.У меня проблемы с анализом с этого момента.Я установил и импортировал библиотеку org.JSON.

    public static void getData(String s) throws Exception {
    String urlBase = new String(theWebSiteImGettingDataFrom)
    URL targetURL = new 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();

    JSONObject obj = new JSONObject(inputLine);
    double eps = obj.getJSONObject("earnings").getDouble("actualEPS");

    System.out.println("This is the first instance of EPS: " + eps);

} // end getData method

Я получаю исключение нулевого указателя в трассировке стека:

    at org.json.JSONTokener.<init>(JSONTokener.java:94)
at org.json.JSONObject.<init>(JSONObject.java:357)
at code.URLConnectionReader.getData(URLConnectionReader.java:39)

Как выполнить синтаксический анализ данных дляпервый экземпляр «actualEPS» и только первый экземпляр?

РЕДАКТИРОВАТЬ

    JSONObject obj = new JSONObject(inputLine);
    JSONArray earningsArray = obj.getJSONArray("earnings");
    JSONObject firstEPS = earningsArray.getJSONObject(0);
    double eps = firstEPS.getDouble("actualEPS");

    System.out.println("This is the first instance of EPS: " + eps);

1 Ответ

0 голосов
/ 30 сентября 2018

Прежде всего, поскольку я понятия не имею, насколько велик ваш 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.

Как и предполагалось, вы можете решить это, просто изменив = на + = .

Надеюсь, мы получили это сейчас.:)

...