public static Visit map(JSONObject jsonObject) throws JSONException {
    Visit visit = new Visit();

    visit.setUuid(getStringFromObject(jsonObject, "uuid"));
    JSONObject locationObject = getJSONObject(jsonObject, "location");
    visit.setVisitPlace(getStringFromObject(locationObject, DISPLAY_KEY));
    JSONObject visitTypeObject = jsonObject.getJSONObject("visitType");
    visit.setVisitType(getStringFromObject(visitTypeObject, DISPLAY_KEY));
    visit.setStartDate(DateUtils.convertTime(getStringFromObject(jsonObject, "startDatetime")));
    visit.setStopDate(DateUtils.convertTime(getStringFromObject(jsonObject, "stopDatetime")));
    List<Encounter> encounterList = new ArrayList<Encounter>();

    if (!jsonObject.isNull("encounters")) {
      JSONArray encountersJSONArray = jsonObject.getJSONArray("encounters");
      for (int i = 0; i < encountersJSONArray.length(); i++) {
        Encounter encounter = new Encounter();
        JSONObject encounterJSONObject = encountersJSONArray.getJSONObject(i);
        List<Observation> observationList = new ArrayList<Observation>();
        encounter.setDisplay(getStringFromObject(encounterJSONObject, DISPLAY_KEY));
        encounter.setUuid(getStringFromObject(encounterJSONObject, "uuid"));
        encounter.setEncounterType(
            Encounter.EncounterType.getType(
                getStringFromObject(
                    getJSONObject(encounterJSONObject, "encounterType"), DISPLAY_KEY)));
        encounter.setEncounterDatetime(
            DateUtils.convertTime(getStringFromObject(encounterJSONObject, "encounterDatetime")));
        JSONArray obsJSONArray = encounterJSONObject.getJSONArray("obs");
        for (int j = 0; j < obsJSONArray.length(); j++) {
          Observation observation = new Observation();
          JSONObject observationJSONObject = obsJSONArray.getJSONObject(j);
          observation.setUuid(getStringFromObject(observationJSONObject, "uuid"));
          if (Encounter.EncounterType.VITALS.equals(encounter.getEncounterType())) {
            String[] labelAndValue =
                getStringFromObject(observationJSONObject, DISPLAY_KEY).split(":");
            observation.setDisplay(labelAndValue[0]);
            observation.setDisplayValue(labelAndValue[1]);
          } else if (Encounter.EncounterType.VISIT_NOTE.equals(encounter.getEncounterType())) {
            observation = ObservationMapper.diagnosisMap(observationJSONObject);
          } else {
            observation.setDisplay(getStringFromObject(observationJSONObject, DISPLAY_KEY));
          }
          observationList.add(observation);
        }
        encounter.setObservations(observationList);
        encounterList.add(encounter);
      }
    }
    visit.setEncounters(encounterList);
    return visit;
  }