如何将 JSONArray 转换为 arraylist

How to convert JSONArray to arraylist

我有 JSONArray(不是 JSONObject),这个数组的内容看起来像:

[{"ID":"24","CardName":"Gool","CardCode":"9785898080617","CardCodeType":"EAN-13","CardHolderName":"\u041f\u0443\u043f\u043a\u0438\u043d","CardCountryCode":"UA","CardHolderID":"3","CardSumRait":"55","VotesCount":"11","Rating":"5"},{"ID":"25","CardName":"XCode","CardCode":"9785898080617","CardCodeType":"EAN-13","CardHolderName":"\u041f\u0443\u043f\u043a\u0438\u043d","CardCountryCode":"UA","CardHolderID":"3","CardSumRait":"31","VotesCount":"8","Rating":"3.875"}]

现在我需要将其转换为 ArrayList,我一直在寻找不同的手册,但尝试了一些代码:

我的JSONParcer:

public class JSONParcer {

ArrayList<Person> getArrayOfWebData = new ArrayList<Person>();
static InputStream is = null;
static JSONObject jsonObject = null;
static String json = "";

//конструктор
public JSONParcer() {

}
class Person {
    public String cardID;
    public String cardName;
    public String cardCode;
    public String cardCodeType;
    public String cardHolderName;
    public String cardCountryCode;
    public String cardHolderID;
    public String cardSumRait;
    public String votesCount;
    public String rating;
}

public JSONObject getJSONFromUrl(String url) {
    //делаем HTTP запрос

    try {
        //default HTTP client
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost(url);
        HttpResponse httpResponse = httpClient.execute(httpPost);
        HttpEntity httpEntity = httpResponse.getEntity();
        is = httpEntity.getContent();


    } catch (ClientProtocolException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null){
            sb.append(line + "\n");

        }
        is.close();
        json = sb.toString();




    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();

    }

    catch (IOException e) {
        Log.e("Buffer Error", "Error converting result " + e.toString());
    }
    try {
        jsonObject = new JSONObject(json);
    } catch (JSONException e) {
        Log.e("JSON parcer" , "Error parcing data " +e.toString());
    }
    try{
        JSONArray jsonArray = new JSONArray(json);
        for (int i=0; i < jsonArray.length(); i++) {

            JSONObject json_data = jsonArray.getJSONObject(i);

            Person resultRow = new Person();

            resultRow.cardID = json_data.getString("ID");
            resultRow.cardName = json_data.getString("CardName");
            resultRow.cardCode = json_data.getString("CardCode");
            resultRow.cardCodeType = json_data.getString("CardCodeType");
            resultRow.cardHolderName = json_data.getString("CardHolderName");
            resultRow.cardCountryCode =json_data.getString("CardCountryCode");
            resultRow.cardHolderID = json_data.getString("CardHolderID");
            resultRow.cardSumRait = json_data.getString("CardSumRait");
            resultRow.votesCount = json_data.getString("VotesCount");
            resultRow.rating = json_data.getString("Rating");


            getArrayOfWebData.add(resultRow);

        }

    } catch (JSONException e) {
        e.printStackTrace();
    }

    return jsonObject;
}

我的 MainActivity:

public class MainActivity extends ActionBarActivity {


String jsonString;
Button btn;

ArrayList<Person> getArrayOfWebData = new ArrayList<Person>();

public void showArrayinLogs(View view) {
    new JsonParce().execute();
}

class Person {
    public String cardID;
    public String cardName;
    public String cardCode;
    public String cardCodeType;
    public String cardHolderName;
    public String cardCountryCode;
    public String cardHolderID;
    public String cardSumRait;
    public String votesCount;
    public String rating;
}

String url1 = "/*my url here*/";
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.menu_main, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    // Handle action bar item clicks here. The action bar will
    // automatically handle clicks on the Home/Up button, so long
    // as you specify a parent activity in AndroidManifest.xml.
    int id = item.getItemId();

    //noinspection SimplifiableIfStatement
    if (id == R.id.action_settings) {
        return true;
    }

    return super.onOptionsItemSelected(item);
}

public class JsonParce extends AsyncTask<String , String, JSONObject>{

    @Override
    protected JSONObject doInBackground(String... args) {
        JSONParcer jsonParcer = new JSONParcer();
        JSONObject json = jsonParcer.getJSONFromUrl(url1);
        return json;
    }

    @Override
    protected void onPostExecute(JSONObject jsonObject ) {
        int a = getArrayOfWebData.size();
        for(int i =0 ; i<a ; i++){
            Log.i("WORKS", getArrayOfWebData.get(i).toString());
        }

    }
}

}

当我启动我的程序并单击按钮以在日志中显示数组时,我有这个

  Value [{"Rating":"5","CardName":"Gool","VotesCount":"11","CardSumRait":"55","CardHolderName":"Пупкин","ID":"24","CardCountryCode":"UA","CardHolderID":"3","CardCode":"9785898080617","CardCodeType":"EAN-13"},{"Rating":"3.875","CardName":"XCode","VotesCount":"8","CardSumRait":"31","CardHolderName":"Пупкин","ID":"25","CardCountryCode":"UA","CardHolderID":"3","CardCode":"9785898080617","CardCodeType":"EAN-13"}] of type org.json.JSONArray cannot be converted to JSONObject

我知道我在我的 JSONParcer class 中犯了错误,但是你能解释一下我需要改变什么吗?只是将 JSONObject 重命名为 JSONArray 并不能正常工作。感谢回答

因为 json 中提供的字符串 post 是 JSONArray of JSONObject 而不是 JSONObject。所以需要从 api.

的响应中获取 JSONArray

getJSONFromUrl 方法中进行以下更改:

1.getJSONFromUrl 方法 return 类型从 JSONObject

更改为 JSONArray

2. 将响应字符串转换为 JSONArray 而不是 JSONObject:

jsonArray = new JSONArray(json);

3. Return jsonArray 来自 getJSONFromUrl

4.MainActivity class 从 getJSONFromUrl 方法得到 JSONArray:

JSONArray json = jsonParcer.getJSONFromUrl(url1);

5. 同时将 doInBackground 方法 return 类型更改为 JSONArray

你可以像你正在使用的那样解析它,或者你可以使用 Gson as described in this answer or you can use Jackson as described here.

以更少的代码和更高的性能来做同样的事情

问题出在你的JSONParcerclass。在下面的代码中,您试图从 JSON 数组 (json) 创建一个 JSON 对象,这就是您收到错误 type org.json.JSONArray cannot be converted to JSONObject.

的原因
try {
    jsonObject = new JSONObject(json);
} catch (JSONException e) {
    Log.e("JSON parcer" , "Error parcing data " +e.toString());
}

解决此问题的方法是删除那部分代码,因为您正在阅读 json 两次。

你在这里已经做对了 --> JSONArray jsonArray = new JSONArray(json);.

public class JSONParcer {

    ArrayList<Person> getArrayOfWebData = new ArrayList<Person>();
    static InputStream is = null;
    static JSONArray jsonArray = null;
    static String json = "";

    ....


    // change getJSONFromUrl to return ArrayList<Person>
    public ArrayList<Person> getJSONFromUrl(String url) {
    //делаем HTTP запрос

    ....


        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null){
                sb.append(line + "\n");
            }
            is.close();
            json = sb.toString();

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

    catch (IOException e) {
        Log.e("Buffer Error", "Error converting result " + e.toString());
    }

    try{
        jsonArray = new JSONArray(json);
        for (int i=0; i < jsonArray.length(); i++) {

            JSONObject json_data = jsonArray.getJSONObject(i);

            Person resultRow = new Person();

            resultRow.cardID = json_data.getString("ID");
            resultRow.cardName = json_data.getString("CardName");
            resultRow.cardCode = json_data.getString("CardCode");
            resultRow.cardCodeType = json_data.getString("CardCodeType");
            resultRow.cardHolderName = json_data.getString("CardHolderName");
            resultRow.cardCountryCode =json_data.getString("CardCountryCode");
            resultRow.cardHolderID = json_data.getString("CardHolderID");
            resultRow.cardSumRait = json_data.getString("CardSumRait");
            resultRow.votesCount = json_data.getString("VotesCount");
            resultRow.rating = json_data.getString("Rating");

            getArrayOfWebData.add(resultRow);

        }

    } catch (JSONException e) {
        e.printStackTrace();
    }

    // return ArrayList<Person>
    return getArrayOfWebData;
}

然后在你的MainActivity中,将doInBackground返回的对象,对象输入类型改为AsyncTask,对象输入类型onPostExecute改为JSONArray:

public class MainActivity extends ActionBarActivity {

...

public class JsonParce extends AsyncTask<String, String, ArrayList<Person>>{

    @Override
    protected ArrayList<Person> doInBackground(String... args) {
        JSONParcer jsonParcer = new JSONParcer();
        ArrayList<Person> personArrayList = jsonParcer.getJSONFromUrl(url1);
        return personArrayList;
    }

    @Override
    protected void onPostExecute(ArrayList<Person> personArrayList) {
        int a = personArrayList.size();
        for(int i =0 ; i<a ; i++){
            Log.i("WORKS", personArrayList.get(i).toString());
        }

    }
}
}

编辑

我根据您的评论更新了我的回答。您的 JsonParce AsyncTask 现在 returns ArrayListPerson。让我知道这是否有帮助。