我是Android Studio新手,我正在尝试从Github API请求API数据(例如https://api.github.com/users/froala)并显示在我的应用中。
我以某种方式让应用程序通过执行以下操作从API检索JSON:
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;
BufferedReader 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 BufferedReader(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);
}
}
}
看起来像:
现在我只需要使用它来解析JSON。但问题是,当我在JSON中使用不同的URL(如https://api.github.com/users/froala/repos)时,检索JSON数据不起作用,并且单击按钮时应用程序不显示任何内容。这很奇怪,因为/ users / id页面和/ users / id / repos页面都是JSON,似乎没有那么不同。我不知道为什么另一个不起作用。
两个问题:
请帮忙!我真的很困惑。
答案 0 :(得分:1)
您可以使用Retrofit并从URL获取数据:
您可以参考:
https://www.androidhive.info/2016/05/android-working-with-retrofit-http-library/
您可以使用上面的对象
使用您的JSON字符串,我使用http://www.jsonschema2pojo.org/并创建对象:
$ ((... above with mod pasted into terminal ...)
apple-dns.net
----------------------------------- com.example.Owner.java ----- ------------------------------
-----------------------------------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;
}
}
使用Retrofit,例如:
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("starred_url")
@Expose
private String starredUrl;
@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 getStarredUrl() {
return starredUrl;
}
public void setStarredUrl(String starredUrl) {
this.starredUrl = starredUrl;
}
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;
}
}
我希望它能帮到你解决问题!
答案 1 :(得分:1)
像Retrofit这样的第三方库当然更好地工作,然后手动迭代数据,但是如果你不愿意这样做,你可以按照这个过程检索结果,如果结果数据是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());
}
}
如果结果数据是JSONArray,那么您需要以这种方式解析它:
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){
}
}
根据 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)
}