Manera eficiente / manera correcta de recuperar datos JSON

Soy nuevo en Android Studio y estoy tratando de solicitar datos API de la API de Github (ej. Https://api.github.com/users/froala ) y mostrarlos en mi aplicación.

De alguna manera hice que la aplicación recuperara el JSON de la API haciendo:

public class MainActivity extends AppCompatActivity { private TextView tvData; private static final String TAG = "MainActivity"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d(TAG, "onCreate: Starting."); // Set up the ViewPager with the sections adapter // Github tab Button buttonHit = (Button) findViewById(R.id.buttonHit); tvData = (TextView) findViewById(R.id.tvJsonItem); buttonHit.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new JSONTask().execute("https://api.github.com/users/froala"); } }); } public class JSONTask extends AsyncTask<String, String, String> { @Override protected String doInBackground(String... params) { HttpURLConnection connection = null; BuffenetworkingReader reader = null; try { // Pass in a String and convert to URL URL url = new URL(params[0]); connection = (HttpURLConnection) url.openConnection(); connection.connect(); InputStream stream = connection.getInputStream(); // for reading data line by line reader = new BuffenetworkingReader(new InputStreamReader(stream)); StringBuffer strBuffer = new StringBuffer(); String line = ""; while ((line = reader.readLine()) != null) { strBuffer.append(line); } // If we are able to get the data String retreivedJson = strBuffer.toString(); JSONObject parentObject = new JSONObject(retreivedJson); JsonReader jsonReader = new JsonReader(responseBody); return retreivedJson; } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } finally { //cant close null if (connection != null) { // close both connection and the reader connection.disconnect(); } try { if (reader != null) { reader.close(); } } catch (IOException e) { e.printStackTrace(); } } return null; } @Override protected void onPostExecute(String result) { super.onPostExecute(result); tvData.setText(result); } } } 

En parece:

enter image description here

Ahora solo necesito usar esto para analizar el JSON. Pero el problema es que cuando uso una URL diferente en el JSON como https://api.github.com/users/froala/repos , la recuperación de los datos JSON no funciona y la aplicación no muestra nada cuando se hace clic en los botones. Esto es extraño porque la página / users / id y la página / users / id / repos son ambos JSON y no parecen tan diferentes. No sé por qué el otro no funciona.

Dos preguntas:

  1. ¿Estoy usando la forma correcta de recuperar JSON de la API?
  2. ¿Por qué el otro enlace ( https://api.github.com/users/froala/repos ) no funciona con la implementación de mi código?

¡Por favor ayuda! Estoy realmente confundido.

Las bibliotecas de terceros como Retrofit funcionan, por supuesto, mejor que iterar a través de los datos manualmente, pero en caso de que no esté dispuesto a seguir por ese path, puede seguir este procedimiento para recuperar resultados si los datos resultantes son un JSONObject:

 public void formatJSONObjectData(String results){ try { JSONObject jsonObject = new JSONObject(results); if(jsonObject.optString("login")!=null) tvData.append(jsonObject.getString("login")); if (jsonObject.optInt("id")!=null) tvData.append(jsonObject.getString("id")); if(jsonObject.optString("avatar_url")!=null) tvData.append(jsonObject.getString("avatar_url")); //you could accordingly retrieve the results from the jsonObject for a specfic key and append it to the TextView }catch (JSONException jsonException){ Log.e("Error",jsonException.getMessage()); } } 

Si los datos resultantes son JSONArray, entonces necesita analizarlos de esta manera:

 public void formatJSONArray(String results){ try { JSONArray jsonArray = new JSONArray(results); for(int i=0;i<jsonArray.length();i++){ JSONObject jsonObject=jsonArray.getJSONObject(i); if(jsonObject.optString("name")!=null) tvData.append(jsonObject.getString("name")); if (jsonObject.optInt("id")!=null) tvData.append(jsonObject.getString("id")); if(jsonObject.optString("full_name")!=null) tvData.append(jsonObject.getString("full_name")); if(jsonObject.optJSONObject("owner")!=null){ JSONObject ownerObject=jsonObject.getJSONObject("owner"); if(ownerObject.optString("login")!=null) tvData.append(ownerObject.getString("login")); if (ownerObject.optInt("id")!=null) tvData.append(ownerObject.getString("id")); if(jsonObject.optString("avatar_url")!=null) tvData.append(ownerObject.getString("avatar_url")); } } }catch (JSONException jsonException){ } } 

Llame a la function según los datos resultantes de su onPostExecute (..)

  @Override protected void onPostExecute(String result) { super.onPostExecute(result); /* for JSONObject data*/ if(result!=null && !result.isEmpty()) formatJSONData(result) /* for JSONArray data*/ if(result!=null && !result.isEmpty()) formatJSONArray(result) } 
  1. Puede usar Retrofit y get datos de la URL:

    Puedes referirte a:

    https://www.androidhive.info/2016/05/android-working-with-retrofit-http-library/

  2. Puedes usar el object de arriba

Con su cadena JSON, uso http://www.jsonschema2pojo.org/ y creo un object:

 -----------------------------------com.example.Example.java----------------------------------- package com.example; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; public class Example { @SerializedName("id") @Expose private Integer id; @SerializedName("name") @Expose private String name; @SerializedName("full_name") @Expose private String fullName; @SerializedName("owner") @Expose private Owner owner; @SerializedName("private") @Expose private Boolean _private; @SerializedName("html_url") @Expose private String htmlUrl; @SerializedName("description") @Expose private String description; @SerializedName("fork") @Expose private Boolean fork; @SerializedName("url") @Expose private String url; @SerializedName("forks_url") @Expose private String forksUrl; @SerializedName("keys_url") @Expose private String keysUrl; @SerializedName("collaborators_url") @Expose private String collaboratorsUrl; @SerializedName("teams_url") @Expose private String teamsUrl; @SerializedName("hooks_url") @Expose private String hooksUrl; @SerializedName("issue_events_url") @Expose private String issueEventsUrl; @SerializedName("events_url") @Expose private String eventsUrl; @SerializedName("assignees_url") @Expose private String assigneesUrl; @SerializedName("branches_url") @Expose private String branchesUrl; @SerializedName("tags_url") @Expose private String tagsUrl; @SerializedName("blobs_url") @Expose private String blobsUrl; @SerializedName("git_tags_url") @Expose private String gitTagsUrl; @SerializedName("git_refs_url") @Expose private String gitRefsUrl; @SerializedName("trees_url") @Expose private String treesUrl; @SerializedName("statuses_url") @Expose private String statusesUrl; @SerializedName("languages_url") @Expose private String languagesUrl; @SerializedName("stargazers_url") @Expose private String stargazersUrl; @SerializedName("contributors_url") @Expose private String contributorsUrl; @SerializedName("subscribers_url") @Expose private String subscribersUrl; @SerializedName("subscription_url") @Expose private String subscriptionUrl; @SerializedName("commits_url") @Expose private String commitsUrl; @SerializedName("git_commits_url") @Expose private String gitCommitsUrl; @SerializedName("comments_url") @Expose private String commentsUrl; @SerializedName("issue_comment_url") @Expose private String issueCommentUrl; @SerializedName("contents_url") @Expose private String contentsUrl; @SerializedName("compare_url") @Expose private String compareUrl; @SerializedName("merges_url") @Expose private String mergesUrl; @SerializedName("archive_url") @Expose private String archiveUrl; @SerializedName("downloads_url") @Expose private String downloadsUrl; @SerializedName("issues_url") @Expose private String issuesUrl; @SerializedName("pulls_url") @Expose private String pullsUrl; @SerializedName("milestones_url") @Expose private String milestonesUrl; @SerializedName("notifications_url") @Expose private String notificationsUrl; @SerializedName("labels_url") @Expose private String labelsUrl; @SerializedName("releases_url") @Expose private String releasesUrl; @SerializedName("deployments_url") @Expose private String deploymentsUrl; @SerializedName("created_at") @Expose private String createdAt; @SerializedName("updated_at") @Expose private String updatedAt; @SerializedName("pushed_at") @Expose private String pushedAt; @SerializedName("git_url") @Expose private String gitUrl; @SerializedName("ssh_url") @Expose private String sshUrl; @SerializedName("clone_url") @Expose private String cloneUrl; @SerializedName("svn_url") @Expose private String svnUrl; @SerializedName("homepage") @Expose private String homepage; @SerializedName("size") @Expose private Integer size; @SerializedName("stargazers_count") @Expose private Integer stargazersCount; @SerializedName("watchers_count") @Expose private Integer watchersCount; @SerializedName("language") @Expose private String language; @SerializedName("has_issues") @Expose private Boolean hasIssues; @SerializedName("has_projects") @Expose private Boolean hasProjects; @SerializedName("has_downloads") @Expose private Boolean hasDownloads; @SerializedName("has_wiki") @Expose private Boolean hasWiki; @SerializedName("has_pages") @Expose private Boolean hasPages; @SerializedName("forks_count") @Expose private Integer forksCount; @SerializedName("mirror_url") @Expose private Object mirrorUrl; @SerializedName("archived") @Expose private Boolean archived; @SerializedName("open_issues_count") @Expose private Integer openIssuesCount; @SerializedName("forks") @Expose private Integer forks; @SerializedName("open_issues") @Expose private Integer openIssues; @SerializedName("watchers") @Expose private Integer watchers; @SerializedName("default_branch") @Expose private String defaultBranch; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getFullName() { return fullName; } public void setFullName(String fullName) { this.fullName = fullName; } public Owner getOwner() { return owner; } public void setOwner(Owner owner) { this.owner = owner; } public Boolean getPrivate() { return _private; } public void setPrivate(Boolean _private) { this._private = _private; } public String getHtmlUrl() { return htmlUrl; } public void setHtmlUrl(String htmlUrl) { this.htmlUrl = htmlUrl; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public Boolean getFork() { return fork; } public void setFork(Boolean fork) { this.fork = fork; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getForksUrl() { return forksUrl; } public void setForksUrl(String forksUrl) { this.forksUrl = forksUrl; } public String getKeysUrl() { return keysUrl; } public void setKeysUrl(String keysUrl) { this.keysUrl = keysUrl; } public String getCollaboratorsUrl() { return collaboratorsUrl; } public void setCollaboratorsUrl(String collaboratorsUrl) { this.collaboratorsUrl = collaboratorsUrl; } public String getTeamsUrl() { return teamsUrl; } public void setTeamsUrl(String teamsUrl) { this.teamsUrl = teamsUrl; } public String getHooksUrl() { return hooksUrl; } public void setHooksUrl(String hooksUrl) { this.hooksUrl = hooksUrl; } public String getIssueEventsUrl() { return issueEventsUrl; } public void setIssueEventsUrl(String issueEventsUrl) { this.issueEventsUrl = issueEventsUrl; } public String getEventsUrl() { return eventsUrl; } public void setEventsUrl(String eventsUrl) { this.eventsUrl = eventsUrl; } public String getAssigneesUrl() { return assigneesUrl; } public void setAssigneesUrl(String assigneesUrl) { this.assigneesUrl = assigneesUrl; } public String getBranchesUrl() { return branchesUrl; } public void setBranchesUrl(String branchesUrl) { this.branchesUrl = branchesUrl; } public String getTagsUrl() { return tagsUrl; } public void setTagsUrl(String tagsUrl) { this.tagsUrl = tagsUrl; } public String getBlobsUrl() { return blobsUrl; } public void setBlobsUrl(String blobsUrl) { this.blobsUrl = blobsUrl; } public String getGitTagsUrl() { return gitTagsUrl; } public void setGitTagsUrl(String gitTagsUrl) { this.gitTagsUrl = gitTagsUrl; } public String getGitRefsUrl() { return gitRefsUrl; } public void setGitRefsUrl(String gitRefsUrl) { this.gitRefsUrl = gitRefsUrl; } public String getTreesUrl() { return treesUrl; } public void setTreesUrl(String treesUrl) { this.treesUrl = treesUrl; } public String getStatusesUrl() { return statusesUrl; } public void setStatusesUrl(String statusesUrl) { this.statusesUrl = statusesUrl; } public String getLanguagesUrl() { return languagesUrl; } public void setLanguagesUrl(String languagesUrl) { this.languagesUrl = languagesUrl; } public String getStargazersUrl() { return stargazersUrl; } public void setStargazersUrl(String stargazersUrl) { this.stargazersUrl = stargazersUrl; } public String getContributorsUrl() { return contributorsUrl; } public void setContributorsUrl(String contributorsUrl) { this.contributorsUrl = contributorsUrl; } public String getSubscribersUrl() { return subscribersUrl; } public void setSubscribersUrl(String subscribersUrl) { this.subscribersUrl = subscribersUrl; } public String getSubscriptionUrl() { return subscriptionUrl; } public void setSubscriptionUrl(String subscriptionUrl) { this.subscriptionUrl = subscriptionUrl; } public String getCommitsUrl() { return commitsUrl; } public void setCommitsUrl(String commitsUrl) { this.commitsUrl = commitsUrl; } public String getGitCommitsUrl() { return gitCommitsUrl; } public void setGitCommitsUrl(String gitCommitsUrl) { this.gitCommitsUrl = gitCommitsUrl; } public String getCommentsUrl() { return commentsUrl; } public void setCommentsUrl(String commentsUrl) { this.commentsUrl = commentsUrl; } public String getIssueCommentUrl() { return issueCommentUrl; } public void setIssueCommentUrl(String issueCommentUrl) { this.issueCommentUrl = issueCommentUrl; } public String getContentsUrl() { return contentsUrl; } public void setContentsUrl(String contentsUrl) { this.contentsUrl = contentsUrl; } public String getCompareUrl() { return compareUrl; } public void setCompareUrl(String compareUrl) { this.compareUrl = compareUrl; } public String getMergesUrl() { return mergesUrl; } public void setMergesUrl(String mergesUrl) { this.mergesUrl = mergesUrl; } public String getArchiveUrl() { return archiveUrl; } public void setArchiveUrl(String archiveUrl) { this.archiveUrl = archiveUrl; } public String getDownloadsUrl() { return downloadsUrl; } public void setDownloadsUrl(String downloadsUrl) { this.downloadsUrl = downloadsUrl; } public String getIssuesUrl() { return issuesUrl; } public void setIssuesUrl(String issuesUrl) { this.issuesUrl = issuesUrl; } public String getPullsUrl() { return pullsUrl; } public void setPullsUrl(String pullsUrl) { this.pullsUrl = pullsUrl; } public String getMilestonesUrl() { return milestonesUrl; } public void setMilestonesUrl(String milestonesUrl) { this.milestonesUrl = milestonesUrl; } public String getNotificationsUrl() { return notificationsUrl; } public void setNotificationsUrl(String notificationsUrl) { this.notificationsUrl = notificationsUrl; } public String getLabelsUrl() { return labelsUrl; } public void setLabelsUrl(String labelsUrl) { this.labelsUrl = labelsUrl; } public String getReleasesUrl() { return releasesUrl; } public void setReleasesUrl(String releasesUrl) { this.releasesUrl = releasesUrl; } public String getDeploymentsUrl() { return deploymentsUrl; } public void setDeploymentsUrl(String deploymentsUrl) { this.deploymentsUrl = deploymentsUrl; } public String getCreatedAt() { return createdAt; } public void setCreatedAt(String createdAt) { this.createdAt = createdAt; } public String getUpdatedAt() { return updatedAt; } public void setUpdatedAt(String updatedAt) { this.updatedAt = updatedAt; } public String getPushedAt() { return pushedAt; } public void setPushedAt(String pushedAt) { this.pushedAt = pushedAt; } public String getGitUrl() { return gitUrl; } public void setGitUrl(String gitUrl) { this.gitUrl = gitUrl; } public String getSshUrl() { return sshUrl; } public void setSshUrl(String sshUrl) { this.sshUrl = sshUrl; } public String getCloneUrl() { return cloneUrl; } public void setCloneUrl(String cloneUrl) { this.cloneUrl = cloneUrl; } public String getSvnUrl() { return svnUrl; } public void setSvnUrl(String svnUrl) { this.svnUrl = svnUrl; } public String getHomepage() { return homepage; } public void setHomepage(String homepage) { this.homepage = homepage; } public Integer getSize() { return size; } public void setSize(Integer size) { this.size = size; } public Integer getStargazersCount() { return stargazersCount; } public void setStargazersCount(Integer stargazersCount) { this.stargazersCount = stargazersCount; } public Integer getWatchersCount() { return watchersCount; } public void setWatchersCount(Integer watchersCount) { this.watchersCount = watchersCount; } public String getLanguage() { return language; } public void setLanguage(String language) { this.language = language; } public Boolean getHasIssues() { return hasIssues; } public void setHasIssues(Boolean hasIssues) { this.hasIssues = hasIssues; } public Boolean getHasProjects() { return hasProjects; } public void setHasProjects(Boolean hasProjects) { this.hasProjects = hasProjects; } public Boolean getHasDownloads() { return hasDownloads; } public void setHasDownloads(Boolean hasDownloads) { this.hasDownloads = hasDownloads; } public Boolean getHasWiki() { return hasWiki; } public void setHasWiki(Boolean hasWiki) { this.hasWiki = hasWiki; } public Boolean getHasPages() { return hasPages; } public void setHasPages(Boolean hasPages) { this.hasPages = hasPages; } public Integer getForksCount() { return forksCount; } public void setForksCount(Integer forksCount) { this.forksCount = forksCount; } public Object getMirrorUrl() { return mirrorUrl; } public void setMirrorUrl(Object mirrorUrl) { this.mirrorUrl = mirrorUrl; } public Boolean getArchived() { return archived; } public void setArchived(Boolean archived) { this.archived = archived; } public Integer getOpenIssuesCount() { return openIssuesCount; } public void setOpenIssuesCount(Integer openIssuesCount) { this.openIssuesCount = openIssuesCount; } public Integer getForks() { return forks; } public void setForks(Integer forks) { this.forks = forks; } public Integer getOpenIssues() { return openIssues; } public void setOpenIssues(Integer openIssues) { this.openIssues = openIssues; } public Integer getWatchers() { return watchers; } public void setWatchers(Integer watchers) { this.watchers = watchers; } public String getDefaultBranch() { return defaultBranch; } public void setDefaultBranch(String defaultBranch) { this.defaultBranch = defaultBranch; } } 

———————————– com.example.Owner.java ——– —————————

 package com.example; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; public class Owner { @SerializedName("login") @Expose private String login; @SerializedName("id") @Expose private Integer id; @SerializedName("avatar_url") @Expose private String avatarUrl; @SerializedName("gravatar_id") @Expose private String gravatarId; @SerializedName("url") @Expose private String url; @SerializedName("html_url") @Expose private String htmlUrl; @SerializedName("followers_url") @Expose private String followersUrl; @SerializedName("following_url") @Expose private String followingUrl; @SerializedName("gists_url") @Expose private String gistsUrl; @SerializedName("starnetworking_url") @Expose private String starnetworkingUrl; @SerializedName("subscriptions_url") @Expose private String subscriptionsUrl; @SerializedName("organizations_url") @Expose private String organizationsUrl; @SerializedName("repos_url") @Expose private String reposUrl; @SerializedName("events_url") @Expose private String eventsUrl; @SerializedName("received_events_url") @Expose private String receivedEventsUrl; @SerializedName("type") @Expose private String type; @SerializedName("site_admin") @Expose private Boolean siteAdmin; public String getLogin() { return login; } public void setLogin(String login) { this.login = login; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getAvatarUrl() { return avatarUrl; } public void setAvatarUrl(String avatarUrl) { this.avatarUrl = avatarUrl; } public String getGravatarId() { return gravatarId; } public void setGravatarId(String gravatarId) { this.gravatarId = gravatarId; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getHtmlUrl() { return htmlUrl; } public void setHtmlUrl(String htmlUrl) { this.htmlUrl = htmlUrl; } public String getFollowersUrl() { return followersUrl; } public void setFollowersUrl(String followersUrl) { this.followersUrl = followersUrl; } public String getFollowingUrl() { return followingUrl; } public void setFollowingUrl(String followingUrl) { this.followingUrl = followingUrl; } public String getGistsUrl() { return gistsUrl; } public void setGistsUrl(String gistsUrl) { this.gistsUrl = gistsUrl; } public String getStarnetworkingUrl() { return starnetworkingUrl; } public void setStarnetworkingUrl(String starnetworkingUrl) { this.starnetworkingUrl = starnetworkingUrl; } public String getSubscriptionsUrl() { return subscriptionsUrl; } public void setSubscriptionsUrl(String subscriptionsUrl) { this.subscriptionsUrl = subscriptionsUrl; } public String getOrganizationsUrl() { return organizationsUrl; } public void setOrganizationsUrl(String organizationsUrl) { this.organizationsUrl = organizationsUrl; } public String getReposUrl() { return reposUrl; } public void setReposUrl(String reposUrl) { this.reposUrl = reposUrl; } public String getEventsUrl() { return eventsUrl; } public void setEventsUrl(String eventsUrl) { this.eventsUrl = eventsUrl; } public String getReceivedEventsUrl() { return receivedEventsUrl; } public void setReceivedEventsUrl(String receivedEventsUrl) { this.receivedEventsUrl = receivedEventsUrl; } public String getType() { return type; } public void setType(String type) { this.type = type; } public Boolean getSiteAdmin() { return siteAdmin; } public void setSiteAdmin(Boolean siteAdmin) { this.siteAdmin = siteAdmin; } } 

Y usando Retrofit, por ejemplo:

  Call<Example> call = apiService.getData(URL); call.enqueue(new Callback<Example>() { @Override public void onResponse(Call<Example> call, Response<Example> response) { Log.d(TAG, "response.body(): " + response.body().getExample()); } @Override public void onFailure(Call<Example> call, Throwable t) { // Log error here since request failed Log.e(TAG, t.toString()); } }); 

¡Espero que te ayude con tu problema!