如何在Android中解析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

我正在尝试解析这个JSON

JSON响应

我没有在日志中获取完整的JSON数据,只是在链接中

异步任务

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;i
String[]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() {

            }
        });