Android Kotlin разбирает вложенный JSON - PullRequest
0 голосов
/ 10 января 2019

Я все еще довольно новичок в программировании с Kotlin, но я не могу понять, как правильно проанализировать мой JSON. Я пытаюсь получить "заголовок" и "тело" из "уведомления" только в массиве "unackd".

Пока у меня есть:

private fun parse(): Boolean {
    try {
        val ja = JSONArray(jsonData)
        var jo: JSONObject

        users.clear()
        var user: User

        for (i in 0 until ja.length()) {
            jo = ja.getJSONObject(i)

            val name = jo.getString("title")
            val username = jo.getString("body")

            user = User(username,name)
            users.add(user)
        }

        return true
    } catch (e: JSONException) {
        e.printStackTrace()
        return false
    }
}

Между тем мой JSON структурирован так:

{
"unackd": [
    {
        "notification": {
            "title": "Title Test Number 200",
            "body": "passage local they water difficulty tank industry allow increase itself captured strike immediately type phrase driver change save potatoes stems addition behavior grain trap rapidly love refused way television bright 1100"
        },
        "data": {
            "id": "1100",
            "phone": "+15555551234"
        }
    },
    {
        "notification": {
            "title": "Title Test Number 199",
            "body": "announced beside well noted mysterious farm he essential likely deeply vast touch 1099"
        },
        "data": {
            "id": "1099",
            "phone": "+15555551234"
        }
    }
],
"ackd": [
   {
        "notification": {
            "title": "Title Test Number 200",
            "body": "passage local they water difficulty tank industry allow increase itself captured strike immediately type phrase driver change save potatoes stems addition behavior grain trap rapidly love refused way television bright 1100"
        },
        "data": {
            "id": "1100",
            "phone": "+15555551234"
        }
    },
    {
        "notification": {
            "title": "Title Test Number 199",
            "body": "announced beside well noted mysterious farm he essential likely deeply vast touch 1099"
        },
        "data": {
            "id": "1099",
            "phone": "+15555551234"
        }
    }
]
}

Я полагаю, что моя проблема связана с «уведомлением», чтобы получить строки «title» и «body». Что я пробовал

test1 = jo.getJSONObject("notification")

Любая помощь будет оценена!

EDIT:

Это моя ошибка logcat, я предполагаю, что это связано с JSON.typeMismatch:

at org.json.JSON.typeMismatch(JSON.java:111)
at org.json.JSONArray.<init>(JSONArray.java:96)
at org.json.JSONArray.<init>(JSONArray.java:108)
at android.os.AsyncTask$2.call(AsyncTask.java:333)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)

Ответы [ 4 ]

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

Следующие классы данных генерируются для вашего JSON с использованием https://json2kotlin.com

data class Json4Kotlin_Base (

    val unackd : List<Unackd>,
    val ackd : List<Ackd>
)

и

data class Data (

    val id : Int,
    val phone : Int
)

и

data class Notification (

    val title : String,
    val body : String
)

и

data class Ackd (

    val notification : Notification,
    val data : Data
)

и

data class Unackd (

    val notification : Notification,
    val data : Data
)

Вот видео , которое объясняет, как реализовать их при генерации.

0 голосов
/ 10 января 2019
Listen Friend ,
Its so simple that you are going to parsing the JSON Object ...with JSON ARRAY with Key like : unackd , ackd

    There is 2 way..

1st ....
You JSON to Pojo schema
http://www.jsonschema2pojo.org/


    public class Ackd {

@SerializedName("notification")
@Expose
private Notification_ notification;
@SerializedName("data")
@Expose
private Data_ data;

public Notification_ getNotification() {
return notification;
}

public void setNotification(Notification_ notification) {
this.notification = notification;
}

public Data_ getData() {
return data;
}

public void setData(Data_ data) {
this.data = data;
}

}

    public class Data {

@SerializedName("id")
@Expose
private String id;
@SerializedName("phone")
@Expose
private String phone;

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getPhone() {
return phone;
}

public void setPhone(String phone) {
this.phone = phone;
}

}

No need to Make all class for parsing Like  ackd (Json Array )

2nd Way.

you need to get only PARSE JSON array with name only unackd  not ackd.



                     String jsonStr = sh.makeServiceCall(url);
                    JSONObject jsonObj = new JSONObject(jsonStr);

                    // Getting JSON Array node
                    JSONArray unA= jsonObj.getJSONArray("unackd");

                    for (int i = 0; i < unA.length(); i++) 
                        {
                        JSONObject c = unA.getJSONObject(i);
                          String title= c.getString("title");
                        String body= c.getString("body");
                        }
0 голосов
/ 10 января 2019

Сообщение об исключении предполагает, что вы передаете данные, которые не представляют массив JSON при создании экземпляра JSONArray:

at org.json.JSON.typeMismatch(JSON.java:111)
at org.json.JSONArray.<init>(JSONArray.java:96)

JSON, который вы прикрепили, на самом деле является объектом JSON, обратите внимание, что его содержимое заключено в {}. Следовательно, для доступа к массиву "unackd" необходимо сначала создать объект JSON, а затем обратиться к массиву внутри него:

val root = JSONObject(jsonData)
val ja = root.getJSONArray("unackd")
// the rest of your code goes here
0 голосов
/ 10 января 2019
  1. Автогенерация Класс данных
    http://www.jsonschema2pojo.org/

  2. Я полагаю, что ваш класс называется Response.java

    Объект ответа = новый Gson (). Fromjson (jsonContentFile, Response.class);

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...