如何在Android中解析JSON文档?
我正在尝试解析这个JSON JSON响应 我没有在日志中获取完整的JSON数据,只是在链接中 异步任务如何在Android中解析JSON文档?,android,json,Android,Json,我正在尝试解析这个JSON JSON响应 我没有在日志中获取完整的JSON数据,只是在链接中 异步任务 public class FetchMangaTask extends AsyncTask<String,Void,String[]>{ private final String LOG_TAG = FetchMangaTask.class.getSimpleName(); private String[] getMangaDataFromJson(Stri
public class FetchMangaTask extends AsyncTask<String,Void,String[]>{
private final String LOG_TAG = FetchMangaTask.class.getSimpleName();
private String[] getMangaDataFromJson(String mangaJsonStr, int pages) throws JSONException{
final String MANGA_LIST = "manga";
final String MANGA_TITLE = "t";
final String MANGA_ID = "i";
JSONObject mangaJson = new JSONObject(mangaJsonStr);
JSONArray mangaArray = mangaJson.getJSONArray(MANGA_LIST);
String[] resultStr = new String[pages];
for (int i = 0; i <mangaArray.length(); i++){
JSONObject manga = mangaArray.getJSONObject(i);
String title = manga.getString(MANGA_TITLE);
String id = manga.getString(MANGA_ID);
}
for (String s : resultStr){
Log.v(LOG_TAG,"Manga Entry" + s);
}
return resultStr;
}
@Override
protected String[] doInBackground(String... params) {
if (params.length == 0){
return null;
}
HttpURLConnection urlConnection = null;
BufferedReader reader = null;
String mangaJsonStr = null;
int pages = 1;
try {
final String MANGA_BASE_URL = "https://www.mangaeden.com/api/list/0/?";
final String PAGES_PARAM = "p";
Uri builtUri = Uri.parse(MANGA_BASE_URL).buildUpon()
.appendQueryParameter(PAGES_PARAM, Integer.toString(pages))
.build();
URL url = new URL(builtUri.toString());
Log.v(LOG_TAG, "Built URI " + builtUri.toString());
urlConnection = (HttpURLConnection)url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.connect();
InputStream inputStream = urlConnection.getInputStream();
StringBuffer buffer = new StringBuffer();
if (inputStream == null){
return null;
}
reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine())!= null){
buffer.append(line + "\n");
}
if (buffer.length() == 0){
return null;
}
mangaJsonStr = buffer.toString();
}catch (IOException e){
Log.e(LOG_TAG, "Error", e);
return null;
}finally {
if (urlConnection != null){
urlConnection.disconnect();
}
if (reader != null){
try{
reader.close();
}catch (final IOException e){
Log.e(LOG_TAG,"Error closing stream", e);
}
}
try {
return getMangaDataFromJson(mangaJsonStr, pages);
} catch (JSONException e) {
Log.e(LOG_TAG, e.getMessage(), e);
e.printStackTrace();
}
}
return null;
}
}
公共类FetchMangaTask扩展异步任务{
私有最终字符串LOG_TAG=FetchMangaTask.class.getSimpleName();
私有字符串[]getMangaDataFromJson(字符串mangaJsonStr,int pages)抛出JSONException{
最终字符串MANGA_LIST=“MANGA”;
最终字符串MANGA_TITLE=“t”;
最终字符串MANGA_ID=“i”;
JSONObject mangaJson=新的JSONObject(mangaJsonStr);
JSONArray mangaArray=mangaJson.getJSONArray(漫画列表);
String[]resultStr=新字符串[页面];
对于(inti=0;iString[]resultStr=newstring[pages];
对于(int i=0;i您从未在resultStr
中输入值。为什么不在第一个循环中记录您的输入或向resultStr
添加值
for (int i = 0; i <mangaArray.length(); i++){
JSONObject manga = mangaArray.getJSONObject(i);
String title = manga.getString(MANGA_TITLE);
String id = manga.getString(MANGA_ID);
//Log
Log.v(LOG_TAG,"Manga Entry" + manga.toString());
//Add value assuming i < pages
resultStr[i] = manga.toString();
}
for(inti=0;i我建议您始终为JSON创建类结构。
类页面将每个页面封装在JSON中。您还可以向JSONParser类添加meta以控制加载
import android.net.Uri;
import android.util.Log;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
/**
* @autor Sergey Shustikov (sergey.shustikov@agileengine.com)
*/
public class JSONParser {
private static final String LOG_TAG = JSONParser.class.getSimpleName();
public interface PageCallback {
void onPagesReceived(ArrayList<Page> pages);
void onFail();
}
public class Page {
public String a;
public ArrayList<String> c;
public String h;
public String id;
public String im;
public String ld;
public String s;
public String title;
}
public void loadPages(final int pageIndex, final PageCallback callback) {
new Thread(new Runnable() {
@Override
public void run() {
load(pageIndex, callback);
}
}).start();
}
private void load(int pageIndex, PageCallback callback) {
HttpURLConnection urlConnection = null;
BufferedReader reader = null;
String mangaJsonStr = null;
int pages = pageIndex;
try {
final String MANGA_BASE_URL = "https://www.mangaeden.com/api/list/0/?";
final String PAGES_PARAM = "p";
Uri builtUri = Uri.parse(MANGA_BASE_URL).buildUpon()
.appendQueryParameter(PAGES_PARAM, Integer.toString(pages))
.build();
URL url = new URL(builtUri.toString());
Log.v(LOG_TAG, "Built URI " + builtUri.toString());
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.connect();
InputStream inputStream = urlConnection.getInputStream();
StringBuffer buffer = new StringBuffer();
reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
buffer.append(line + "\n");
}
mangaJsonStr = buffer.toString();
try {
ArrayList<Page> pgs = getPages(mangaJsonStr);
callback.onPagesReceived(pgs);
} catch (JSONException e) {
e.printStackTrace();
callback.onFail();
}
} catch (IOException e) {
Log.e(LOG_TAG, "Error", e);
callback.onFail();
} finally {
if (urlConnection != null) {
urlConnection.disconnect();
}
if (reader != null) {
try {
reader.close();
} catch (final IOException e) {
Log.e(LOG_TAG, "Error closing stream", e);
}
}
}
}
private ArrayList<Page> getPages(String mangaJsonStr) throws JSONException {
final String MANGA_LIST = "manga";
final String MANGA_TITLE = "t";
final String MANGA_ID = "i";
JSONObject mangaJson = new JSONObject(mangaJsonStr);
JSONArray mangaArray = mangaJson.getJSONArray(MANGA_LIST);
ArrayList<Page> pages = new ArrayList<>();
for (int i = 0; i < mangaArray.length(); i++) {
JSONObject manga = mangaArray.getJSONObject(i);
String title = manga.getString(MANGA_TITLE);
String id = manga.getString(MANGA_ID);
Page page = new Page();
page.title = title;
page.id = id;
pages.add(page);
}
return pages;
}
}
导入android.net.Uri;
导入android.util.Log;
导入org.json.JSONArray;
导入org.json.JSONException;
导入org.json.JSONObject;
导入java.io.BufferedReader;
导入java.io.IOException;
导入java.io.InputStream;
导入java.io.InputStreamReader;
导入java.net.HttpURLConnection;
导入java.net.URL;
导入java.util.ArrayList;
/**
*@autor谢尔盖·舒斯蒂科夫(谢尔盖。shustikov@agileengine.com)
*/
公共类JSONParser{
私有静态最终字符串LOG_TAG=JSONParser.class.getSimpleName();
公共接口页回调{
收到页面无效(ArrayList页面);
void onFail();
}
公共类页面{
公共字符串a;
公共阵列列表c;
公共字符串h;
公共字符串id;
公共字符串im;
公共字符串ld;
公共字符串s;
公共字符串标题;
}
公共void加载页(final int pageIndex,final PageCallback){
新线程(newrunnable()){
@凌驾
公开募捐{
加载(页面索引、回调);
}
}).start();
}
私有无效加载(int pageIndex,PageCallback){
HttpURLConnection-urlConnection=null;
BufferedReader reader=null;
字符串mangaJsonStr=null;
int pages=pageIndex;
试一试{
最终字符串MANGA_BASE_URL=”https://www.mangaeden.com/api/list/0/?";
最终字符串页_PARAM=“p”;
Uri builtUri=Uri.parse(MANGA_BASE_URL).buildon()
.appendQueryParameter(PAGES_PARAM,Integer.toString(PAGES))
.build();
URL=新URL(builtUri.toString());
Log.v(Log_标记,“builduri”+builduri.toString());
urlConnection=(HttpURLConnection)url.openConnection();
urlConnection.setRequestMethod(“GET”);
urlConnection.connect();
InputStream InputStream=urlConnection.getInputStream();
StringBuffer=新的StringBuffer();
reader=新的BufferedReader(新的InputStreamReader(inputStream));
弦线;
而((line=reader.readLine())!=null){
buffer.append(第+行“\n”);
}
mangaJsonStr=buffer.toString();
试一试{
ArrayList pgs=getPages(mangaJsonStr);
callback.onPagesReceived(pgs);
}捕获(JSONException e){
e、 printStackTrace();
callback.onFail();
}
}捕获(IOE异常){
Log.e(Log_标签,“Error”,e);
callback.onFail();
}最后{
if(urlConnection!=null){
urlConnection.disconnect();
}
if(读卡器!=null){
试一试{
reader.close();
}捕获(最终IOE例外){
Log.e(Log_标签,“错误关闭流”,e);
}
}
}
}
私有ArrayList getPages(字符串mangaJsonStr)抛出JSONException{
最终字符串MANGA_LIST=“MANGA”;
最终字符串MANGA_TITLE=“t”;
最终字符串MANGA_ID=“i”;
JSONObject mangaJson=新的JSONObject(mangaJsonStr);
JSONArray mangaArray=mangaJson.getJSONArray(漫画列表);
ArrayList pages=新建ArrayList();
对于(int i=0;i
要加载:
JSONParser parser = new JSONParser();
parser.loadPages(1, new JSONParser.PageCallback() {
@Override
public void onPagesReceived(ArrayList<JSONParser.Page> pages) {
System.out.println(pages.size());
}
@Override
public void onFail() {
}
});
JSONParser=newjsonparser();
loadPages(1,新的JSONParser.PageCallback(){
@凌驾
收到页面上的公共无效(ArrayList页面){
System.out.println(pages.size());
}
@凌驾
public void onFail(){
}
});
要获取日志中的所有JSON字符串,请使用log.i(“TAG”,mangaJsonStr);
看起来您在日志Cat中获得了更多内容。@eric247更新了完整的日志CatTry这一点,在您的doInBackground的末尾,添加这个,log.v(“Response”,mangaJsonStr);@ssh更新了完整日志Cat@TahaDemure当你想加载时。但我需要注意:onPagesReceived
将在后台线程中调用,因此如果你想更新你的UI,请使用post
或runOnUIThread
methanism。
for (int i = 0; i <mangaArray.length(); i++){
JSONObject manga = mangaArray.getJSONObject(i);
String title = manga.getString(MANGA_TITLE);
String id = manga.getString(MANGA_ID);
//Log
Log.v(LOG_TAG,"Manga Entry" + manga.toString());
//Add value assuming i < pages
resultStr[i] = manga.toString();
}
import android.net.Uri;
import android.util.Log;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
/**
* @autor Sergey Shustikov (sergey.shustikov@agileengine.com)
*/
public class JSONParser {
private static final String LOG_TAG = JSONParser.class.getSimpleName();
public interface PageCallback {
void onPagesReceived(ArrayList<Page> pages);
void onFail();
}
public class Page {
public String a;
public ArrayList<String> c;
public String h;
public String id;
public String im;
public String ld;
public String s;
public String title;
}
public void loadPages(final int pageIndex, final PageCallback callback) {
new Thread(new Runnable() {
@Override
public void run() {
load(pageIndex, callback);
}
}).start();
}
private void load(int pageIndex, PageCallback callback) {
HttpURLConnection urlConnection = null;
BufferedReader reader = null;
String mangaJsonStr = null;
int pages = pageIndex;
try {
final String MANGA_BASE_URL = "https://www.mangaeden.com/api/list/0/?";
final String PAGES_PARAM = "p";
Uri builtUri = Uri.parse(MANGA_BASE_URL).buildUpon()
.appendQueryParameter(PAGES_PARAM, Integer.toString(pages))
.build();
URL url = new URL(builtUri.toString());
Log.v(LOG_TAG, "Built URI " + builtUri.toString());
urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.connect();
InputStream inputStream = urlConnection.getInputStream();
StringBuffer buffer = new StringBuffer();
reader = new BufferedReader(new InputStreamReader(inputStream));
String line;
while ((line = reader.readLine()) != null) {
buffer.append(line + "\n");
}
mangaJsonStr = buffer.toString();
try {
ArrayList<Page> pgs = getPages(mangaJsonStr);
callback.onPagesReceived(pgs);
} catch (JSONException e) {
e.printStackTrace();
callback.onFail();
}
} catch (IOException e) {
Log.e(LOG_TAG, "Error", e);
callback.onFail();
} finally {
if (urlConnection != null) {
urlConnection.disconnect();
}
if (reader != null) {
try {
reader.close();
} catch (final IOException e) {
Log.e(LOG_TAG, "Error closing stream", e);
}
}
}
}
private ArrayList<Page> getPages(String mangaJsonStr) throws JSONException {
final String MANGA_LIST = "manga";
final String MANGA_TITLE = "t";
final String MANGA_ID = "i";
JSONObject mangaJson = new JSONObject(mangaJsonStr);
JSONArray mangaArray = mangaJson.getJSONArray(MANGA_LIST);
ArrayList<Page> pages = new ArrayList<>();
for (int i = 0; i < mangaArray.length(); i++) {
JSONObject manga = mangaArray.getJSONObject(i);
String title = manga.getString(MANGA_TITLE);
String id = manga.getString(MANGA_ID);
Page page = new Page();
page.title = title;
page.id = id;
pages.add(page);
}
return pages;
}
}
JSONParser parser = new JSONParser();
parser.loadPages(1, new JSONParser.PageCallback() {
@Override
public void onPagesReceived(ArrayList<JSONParser.Page> pages) {
System.out.println(pages.size());
}
@Override
public void onFail() {
}
});