Запрос залога JSONObject Анализ ответа возвращает значение No для - PullRequest
0 голосов
/ 09 апреля 2019

У меня на локальном компьютере работает RESTful API, который возвращает ответ в JSON (на самом деле этот JSON является ответом на запрос клиента Soap nodejs) в зависимости от запроса.Для этого конкретного случая я получаю запрос POST от клиента Android и возвращаю следующий ответ:

{
    QueryAcctBalResponse: {
        BalExDtoList: {
            BalExDto: [{
                BalID: "xxxx",
                AcctResID: "xxxx",
                AcctResName: "xxxx",
                BalType: "xxxx",
                Balance: "xxxx",
                EffDate: "xxxx",
                ExpDate: "xxxx",
                UpdateDate: "xxxx"
            }, {
                BalID: "yyyy",
                AcctResID: "yyyy",
                AcctResName: "yyyy",
                BalType: "yyyy",
                Balance: "yyyy",
                EffDate: "yyyy",
                ExpDate: "yyyy",
                UpdateDate: "yyyy"
            }]
        }
    }
}

Проблема заключается в том, что каждый раз, когда я пытаюсь проанализировать этот ответ и отобразить эту информацию в Android (в частности, «AcctResName»),Я получаю org.json.JSONException: нет значения для BalExDto .Я использую Volley Libray в Android для анализа Json, и я использовал запрос Jsonobject.

Код запроса.

JsonObjectRequest sq = new JsonObjectRequest(Request.Method.POST, balanceUrl, request, new Response.Listener<JSONObject>() {

    @Override
    public void onResponse(JSONObject response) {

        try {
            JSONArray jsonArray = response.getJSONArray("BalExDto");
            for (int i = 0; i < jsonArray.length(); i++){
                JSONObject jsonObject=jsonArray.getJSONObject(i);
                Toast.makeText(CheckBalance.this, ""+jsonObject.get("AcctResName"), Toast.LENGTH_LONG).show();
            }

            pd.hide();
        } catch (JSONException e) {
            e.printStackTrace();
        }
        Log.d("Response", "Response_TAG: "+response);

    }

Ответы [ 3 ]

1 голос
/ 09 апреля 2019

Это потому, что у вас нет массива JSON, у вас есть объект JSON.

Прежде всего, вам нужно получить объект JSON из вашего ответа API,

JSONObject jsonObject = response.getJSONObject("QueryAcctBalResponse")

и внутри этого объекта JSON находится массив JSON.

JSONArray jsonArray = response.getJSONArray("BalExDtoList");
0 голосов
/ 09 апреля 2019

В сообщении об ошибке написано - вы неправильно разбираете BalExDto.BalExDto не является прямым потомком response.Таким образом, вы должны проанализировать QueryAcctBalResponse и BalExDtoList, а затем вы можете получить BalExDto.Потому что BalExDto находится внутри BalExDtoList, а BalExDtoList находится внутри QueryAcctBalResponse.

JsonObjectRequest sq = new JsonObjectRequest(Request.Method.POST, balanceUrl, request, new Response.Listener<JSONObject>() {

@Override
public void onResponse(JSONObject response) {

    try {
        JSONObject queryAcctBalResponse = response.getJSONObject("QueryAcctBalResponse");
        JSONObject balExDtoList = queryAcctBalResponse.getJSONObject("BalExDtoList");
        JSONArray jsonArray = balExDtoList.getJSONArray("BalExDto");
        for (int i = 0; i < jsonArray.length(); i++){
            JSONObject jsonObject=jsonArray.getJSONObject(i);
            Toast.makeText(CheckBalance.this, ""+jsonObject.get("AcctResName"), Toast.LENGTH_LONG).show();
        }

        pd.hide();
    } catch (JSONException e) {
        e.printStackTrace();
    }
    Log.d("Response", "Response_TAG: "+response);

}
0 голосов
/ 09 апреля 2019

BalExDto массив не является прямым потомком ответа.Он находится внутри BalExDtoList, который находится внутри QueryAcctBalResponse объекта.Вы не можете напрямую получить доступ ни к какому узлу в JSON, вам необходимо пройти полный путь, прежде чем вы сможете получить к ним доступ.

Вам необходимо получить массив, как показано ниже

JSONObject queryAcctBalResponse = response.getJSONObject("QueryAcctBalResponse");
JSONObject balExDtoList = queryAcctBalResponse.getJSONObject("BalExDtoList");
JSONArray jsonArray = balExDtoList.getJSONArray("BalExDto");
...