Как получить доступ к вложенным элементам массива JSON, используя только GSON с Java - PullRequest
2 голосов
/ 23 января 2020

Я не могу использовать org.json package.

Проблема

Используйте метод HTTP GET для получения информации из базы данных медицинских карт пациентов. Запрос https://jsonmock.hackerrank.com/api/medical_records, чтобы найти все записи. Результат запроса разбит на страницы и может быть далее доступен путем добавления к строке запроса ?&page=num, где num - номер страницы.

Ответом от API является запрос JSON со следующими пятью полями :

page: the current page
per_page: the maximum number of results per page
total: the total number of records in the search result
total_pages: the total number of pages which must be queried to get all the results
data: an array of JSON objects that contain medical records

Поле данных в ответе содержит список медицинских карт со следующей схемой:

  • id: уникальный идентификатор записи
  • timestamp: отметка времени создания записи (в UT C в виде миллисекунд)
  • userId: идентификатор пользователя, для которого была записана транзакция
  • userName: имя пациента / пользователя, для которого была записана транзакция
  • userDob: дата рождения пользователя в формате ДД-ММ-ГГГГ
  • vitals : объект, жизненные показатели пользователя
  • vitals.bloodPressureDiastole: диастолия c показания давления пользователя, мм рт.ст.
  • vitals.bloodPressureSystole: систоли c показания давления пользователя , мм рт. ст.
  • vitals.pulse: частота пульса пользователя, ударов в минуту
  • * 104 5 *: частота дыхания пользователя, количество вдохов в минуту
  • vitals.bodyTemperature: температура тела пользователя, градусы Фаренгейта
  • diagnosis.id: идентификатор диагноза
  • diagnosis.name: название диагностированного состояния
  • diagnosis.severity: серьезность диагностированного состояния
  • doctor: объект, врач, который диагностировал состояние
  • doctor.id: идентификатор доктора, который диагностировал состояние
  • doctor.name: имя доктора, который диагностировал состояние
  • meta: объект, метаинформация пользователя
  • meta.height: текущий рост пользователя, сантиметров
  • meta.weight: текущий вес пользователя, фунтов

Получить все медицинские записи и фильтр на основе следующих критериев:

ageStart ≤ the age of the user at the time of the record creation timestamp ≤ ageEnd

Для пользователей, соответствующих первому criteria, bloodPressureDiastole - bloodPressureSystole > bpDiff

Функция Описание

Complete the function getRecordsByAgeGroup in the editor below.

getRecordsByAgeGroup has the following parameter(s):

int ageStart: the minimum age requirement (inclusive)

int ageEnd: the maximum age requirement (inclusive)

int bpDiff: the difference in systolic and diastolic pressures must be less than this value

Возвраты: int[] : отсортированный массив идентификаторов записей, соответствующих вышеуказанным критериям. Если не найдено ни одной записи, вернуть [-1]

Ограничения:

0 ≤ ageStart, ageEnd, bpDiff ≤ 102

МОЙ КОД

    import java.net.*;
import com.google.gson.*;

class Result {

    /*
     * Complete the 'getRecordsByAgeGroup' function below.
     *
     * The function is expected to return an INTEGER_ARRAY.
     * The function accepts following parameters:
     *  1. INTEGER ageStart
     *  2. INTEGER ageEnd
     *  3. INTEGER bpDiff
     *
     *  https://jsonmock.hackerrank.com/api/medical_records

     */

    public static List<Integer> getRecordsByAgeGroup(int ageStart, int ageEnd, int bpDiff) {
        int startPage = 1;
        int totalPages = 10;
        String response;
        ArrayList<Integer> ids = new ArrayList<>();
        ArrayList<Long> times = new ArrayList<>();
        List<String> dobs = new ArrayList<>();
        ArrayList<Integer> bpd = new ArrayList<>();
        ArrayList<Integer> bps = new ArrayList<>();
        ArrayList<Integer> results = new ArrayList<>();

        while (startPage <= totalPages) {
            try{
                URL obj = new URL ("https://jsonmock.hackerrank.com/api/medical_records?&page=" + startPage);
                HttpURLConnection con = (HttpURLConnection) obj.openConnection();
                con.setRequestMethod("GET");
                BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
                while ((response = in.readLine()) != null) {
                    JsonObject convertedObject = new Gson().fromJson(response, JsonObject.class);
                    totalPages = convertedObject.get("total_pages").getAsInt();
                    JsonArray data = convertedObject.getAsJsonArray("data");

                    for (int i = 0; i < data.size(); i++){
                        System.out.println(data.get(i));
                        int id = data.get(i).getAsJsonObject().get("id").getAsInt();
                        ids.add(id);
                        Long ts = data.get(i).getAsJsonObject().get("timestamp").getAsLong();
                        times.add(ts);
                        String birth = data.get(i).getAsJsonObject().get("userDob").getAsString();
                        dobs.add(birth);


Необходимо получить доступ к "жизненно важным" элементам - ниже моя попытка

                        JsonParser jsonParser = new JsonParser();
                        JsonObject vitals = jsonParser.parse(json)
                            .data.get(i).getAsJsonObject().get("vitals");
                        int bpdy = vitals.get("bloodPressureDiastole").getAsInt();
                        //JsonArray vitals = data.get(i).getAsJsonArray("vitals");
                        //int bpdy = data.get(i).getAsJsonArray("vitals").getAsJsonObject().get("bloodPressureDiastole").getAsInt();


                       // bpd.add(bpdy);
                        //int bpsy = data.get(i).getAsJsonObject("vitals").getAsJsonObjectAsJsonObject("bloodPressureSystole").getAsInt();
                        //int bpsy=data.get(i).getAsJsonObject("vitals").getAsJsonObject().get("bloodPressureSystole").getAsInt();
                        //bps.add(bpsy);
                    }


                }
                in.close();
                startPage++;

            }
            catch (Exception ex){
                ex.printStackTrace();
            }
        }

        //current age

        for (int i = 0; i < dobs.size(); i++){
            SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");
            try{
            Date dobform = format.parse(dobs.get(i));

                //utc date
            Date date = new Date(times.get(i));
            SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy", Locale.ENGLISH);
            sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
            String tsform = sdf.format(date);
            Date tsformcom = format.parse(tsform);

            int userage = calculateAgeWithJava7(dobform, tsformcom);
            if ((userage==ageStart|| userage>ageStart) & (userage==ageEnd || userage<ageEnd)){
                int actualbpdiff=bpd.get(i)-bps.get(i);
                if (actualbpdiff > bpDiff){
                    results.add(ids.get(i));
                }

            }

            }catch (Exception ex) {
            ex.printStackTrace();
            }





        }

        return results;


    }

    public static int calculateAgeWithJava7(
  Date birthDate,
  Date currentDate) {
    DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
    int d1 = Integer.parseInt(formatter.format(birthDate));
    int d2 = Integer.parseInt(formatter.format(currentDate));
    int age = (d2 - d1) / 10000;
    return age;
}

}

Ответы [ 2 ]

0 голосов
/ 23 января 2020
    JsonObject jsonObject = gson.fromJson(answer, JsonObject.class);
    jsonObject.getAsJsonArray("data").get(0).getAsJsonObject().getAsJsonObject("vitals");

Вернет вам JsonObject, что вам нужно. Все, что вам нужно, это go через массив для l oop (.get (i)).

0 голосов
/ 23 января 2020

Понятия не имею, почему вы думали, что вам понадобится новый JsonParser, когда JSON уже проанализирован.

Просто чтобы мы все могли видеть то, что вы анализируете, вот часть it:

{
  "page": 1,
  "per_page": 10,
  "total": 99,
  "total_pages": 10,
  "data": [
    {
      "id": 1,
      "timestamp": 1565637002408,
      "diagnosis": {
        "id": 3,
        "name": "Pulmonary embolism",
        "severity": 4
      },
      "vitals": {
        "bloodPressureDiastole": 154,
        "bloodPressureSystole": 91,
        "pulse": 125,
        "breathingRate": 32,
        "bodyTemperature": 100
      },
      "doctor": {
        "id": 2,
        "name": "Dr Arnold Bullock"
      },
      "userId": 2,
      "userName": "Bob Martin",
      "userDob": "14-09-1989",
      "meta": {
        "height": 174,
        "weight": 172
      }
    },
    ...
  ]
}

Java является объектно-ориентированным языком. Используй это! Создайте класс для хранения значений данных, затем укажите один List<Data>.

List<Data> dataList = new ArrayList<>();

Вы уже должны выполнить итерацию data, поэтому давайте начнем с этого.

Не поиск объекта в массиве несколько раз. Плохо для производительности и плохо для читабельности кода.

JsonArray dataArray = convertedObject.getAsJsonArray("data");
for (JsonElement dataElem : dataArray) {
    System.out.println(dataElem);

    JsonObject dataObj = dataElem.getAsJsonObject();
    int id = dataObj.get("id").getAsInt();
    long timestamp = dataObj.get("timestamp").getAsLong();
    String userDob = dataObj.get("userDob").getAsString();

    // Now for the good stuff
    JsonObject vitals = dataObj.getAsJsonObject("vitals");
    int bpDiastole = vitals.get("bloodPressureDiastole").getAsInt();
    int bpSystole = vitals.get("bloodPressureSystole").getAsInt();

    Data data = new Data();
    data.setId(id);
    data.setTimestamp(timestamp);
    data.setBirthDate(userDob);
    data.setBpd(bpDiastole);
    data.setBps(bpSystole);
    dataList.add(data);
}

, где класс Data:

public class Data {
    private int id;
    private long timestamp;
    private String birthDate;
    private int bpDiastole;
    private int bpSystole;

    // Getters and setter here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...