EducationJSONImpl(JSONObject json) throws FacebookException {
   try {
     if (!json.isNull("year")) {
       JSONObject yearJSON = json.getJSONObject("year");
       year = new IdNameEntityJSONImpl(yearJSON);
     }
     type = getRawString("type", json);
     if (!json.isNull("school")) {
       JSONObject schoolJSON = json.getJSONObject("school");
       school = new IdNameEntityJSONImpl(schoolJSON);
     }
     if (!json.isNull("degree")) {
       JSONObject degreeJSON = json.getJSONObject("degree");
       degree = new IdNameEntityJSONImpl(degreeJSON);
     }
     if (!json.isNull("concentration")) {
       JSONArray concentrationJSONArray = json.getJSONArray("concentration");
       concentration = new ArrayList<IdNameEntity>();
       for (int i = 0; i < concentrationJSONArray.length(); i++) {
         concentration.add(new IdNameEntityJSONImpl(concentrationJSONArray.getJSONObject(i)));
       }
     } else {
       concentration = Collections.emptyList();
     }
     if (!json.isNull("classes")) {
       JSONArray classesJSONArray = json.getJSONArray("classes");
       classes = new ArrayList<EducationClass>();
       for (int i = 0; i < classesJSONArray.length(); i++) {
         classes.add(new EducationClassJSONImpl(classesJSONArray.getJSONObject(i)));
       }
     } else {
       classes = Collections.emptyList();
     }
     if (!json.isNull("with")) {
       JSONArray withJSONArray = json.getJSONArray("with");
       with = new ArrayList<IdNameEntity>();
       for (int i = 0; i < withJSONArray.length(); i++) {
         with.add(new IdNameEntityJSONImpl(withJSONArray.getJSONObject(i)));
       }
     } else {
       with = Collections.emptyList();
     }
   } catch (JSONException jsone) {
     throw new FacebookException(jsone);
   }
 }
 EducationClassJSONImpl(JSONObject json) throws FacebookException {
   try {
     if (!json.isNull("with")) {
       JSONArray withJSONArray = json.getJSONArray("with");
       with = new ArrayList<IdNameEntity>();
       for (int i = 0; i < withJSONArray.length(); i++) {
         with.add(new IdNameEntityJSONImpl(withJSONArray.getJSONObject(i)));
       }
     } else {
       with = Collections.emptyList();
     }
     description = getRawString("description", json);
   } catch (JSONException jsone) {
     throw new FacebookException(jsone.getMessage() + ":" + json.toString(), jsone);
   }
 }
 private void init(JSONObject json) throws FacebookException {
   try {
     id = getRawString("id", json);
     name = getRawString("name", json);
     firstName = getRawString("first_name", json);
     middleName = getRawString("middle_name", json);
     lastName = getRawString("last_name", json);
     gender = getRawString("gender", json);
     if (!json.isNull("locale")) {
       String[] _locale = getRawString("locale", json).split("_");
       String language = _locale[0];
       String country = _locale[1];
       locale = new Locale(language, country);
     }
     if (!json.isNull("languages")) {
       JSONArray languagesJSONArray = json.getJSONArray("languages");
       final int size = languagesJSONArray.length();
       languages = new ArrayList<IdNameEntity>(size);
       for (int i = 0; i < size; i++) {
         languages.add(new IdNameEntityJSONImpl(languagesJSONArray.getJSONObject(i)));
       }
     } else {
       languages = Collections.emptyList();
     }
     link = getURL("link", json);
     username = getRawString("username", json);
     thirdPartyId = getRawString("third_party_id", json);
     installed = getBoolean("installed", json);
     // Using the current time to compute the timezone offset is technically wrong, because
     // the timezone value corresponds to the user's last login, but it's the best we can do
     long currentTime = System.currentTimeMillis();
     timezone = getTimeZoneOffset("timezone", json, currentTime);
     updatedTime = getISO8601Datetime("updated_time", json);
     verified = getBoolean("verified", json);
     bio = getRawString("bio", json);
     birthday = getRawString("birthday", json);
     if (!json.isNull("cover")) {
       JSONObject coverJSON = json.getJSONObject("cover");
       cover = new CoverJSONImpl(coverJSON);
     }
     if (!json.isNull("education")) {
       JSONArray educationJSONArray = json.getJSONArray("education");
       final int size = educationJSONArray.length();
       education = new ArrayList<User.Education>(size);
       for (int i = 0; i < size; i++) {
         education.add(new EducationJSONImpl(educationJSONArray.getJSONObject(i)));
       }
     } else {
       education = Collections.emptyList();
     }
     email = getRawString("email", json);
     if (!json.isNull("hometown")) {
       String hometownRawString = getRawString("hometown", json);
       if (hometownRawString.startsWith("{")) {
         JSONObject hometownJSON = json.getJSONObject("hometown");
         hometown = new IdNameEntityJSONImpl(hometownJSON);
       } else {
         hometown = new IdNameEntityJSONImpl(hometownRawString);
       }
     }
     if (!json.isNull("interestedIn")) {
       JSONArray interestedInJSONArray = json.getJSONArray("interested_in");
       final int size = interestedInJSONArray.length();
       interestedIn = new ArrayList<String>(size);
       for (int i = 0; i < size; i++) {
         interestedIn.add(interestedInJSONArray.getString(i));
       }
     } else {
       interestedIn = Collections.emptyList();
     }
     if (!json.isNull("location")) {
       JSONObject locationJSON = json.getJSONObject("location");
       location = new IdNameEntityJSONImpl(locationJSON);
     }
     political = getRawString("political", json);
     if (!json.isNull("favorite_athletes")) {
       JSONArray favoriteAthletesJSONArray = json.getJSONArray("favorite_athletes");
       final int size = favoriteAthletesJSONArray.length();
       favoriteAthletes = new ArrayList<IdNameEntity>(size);
       for (int i = 0; i < favoriteAthletesJSONArray.length(); i++) {
         favoriteAthletes.add(
             new IdNameEntityJSONImpl(favoriteAthletesJSONArray.getJSONObject(i)));
       }
     } else {
       favoriteAthletes = Collections.emptyList();
     }
     if (!json.isNull("favorite_teams")) {
       JSONArray favoriteTeamsJSONArray = json.getJSONArray("favorite_teams");
       final int size = favoriteTeamsJSONArray.length();
       favoriteTeams = new ArrayList<IdNameEntity>(size);
       for (int i = 0; i < size; i++) {
         favoriteTeams.add(new IdNameEntityJSONImpl(favoriteTeamsJSONArray.getJSONObject(i)));
       }
     } else {
       favoriteTeams = Collections.emptyList();
     }
     if (!json.isNull("picture")) {
       String pictureRawString = getRawString("picture", json);
       if (pictureRawString.startsWith("{")) {
         JSONObject pictureJSONObject = json.getJSONObject("picture");
         picture = new PictureJSONImpl(pictureJSONObject);
       } else {
         picture = new PictureJSONImpl(getURL("picture", json));
       }
     }
     quotes = getRawString("quotes", json);
     relationshipStatus = getRawString("relationship_status", json);
     religion = getRawString("religion", json);
     if (!json.isNull("significant_other")) {
       JSONObject significantOtherJSONObject = json.getJSONObject("significant_other");
       significantOther = new IdNameEntityJSONImpl(significantOtherJSONObject);
     }
     if (!json.isNull("video_upload_limits")) {
       JSONObject videoUploadLimitsJSONObject = json.getJSONObject("video_upload_limits");
       videoUploadLimits = new VideoUploadLimitsJSONImpl(videoUploadLimitsJSONObject);
     }
     website = getURL("website", json);
     if (!json.isNull("work")) {
       JSONArray workJSONArray = json.getJSONArray("work");
       final int size = workJSONArray.length();
       work = new ArrayList<Work>(size);
       for (int i = 0; i < size; i++) {
         work.add(new WorkJSONImpl(workJSONArray.getJSONObject(i)));
       }
     } else {
       work = Collections.emptyList();
     }
     if (!json.isNull("age_range")) {
       JSONObject ageRangeJSONObject = json.getJSONObject("age_range");
       ageRange = new AgeRangeJSONImpl(ageRangeJSONObject);
     }
     if (!json.isNull("metadata")) {
       JSONObject metadataJSONObject = json.getJSONObject("metadata");
       metadata = new MetadataImpl(metadataJSONObject);
     }
   } catch (JSONException jsone) {
     throw new FacebookException(jsone.getMessage() + ":" + json.toString(), jsone);
   }
 }