Android Kotlin анализирует вложенный JSON

Я все еще новичок в программировании на 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")

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

Обновлено:

Это моя ошибка 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)

Почему вы не используете библиотеку Gson?

Bulma 10.01.2019 02:36

Так что же именно происходит? Вы получаете исключение JSONException? Вы получаете неверные данные?

Egor 10.01.2019 02:45

@Egor Добавил информацию об ошибке logcat

J. Doe43 10.01.2019 17:23

Вы можете использовать jsonschema2pojo.org с GSON

EpicPandaForce 10.01.2019 22:16
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
4
8 160
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

  1. Автоматическое создание класса данных
    http://www.jsonschema2pojo.org/

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

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

Послушай, друг, разобрать объект JSON с помощью JSON ARRAY с ключом (например: unackd, ackd) так просто.

Есть 2 способа:

1-й способ) Разберите ваш JSON на схему Pojo 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;
}

}

Не нужно делать весь класс для синтаксического анализа (например, ackd (Json Array))

2-й способ)

Вам нужно PARSE JSON-массив только с именем 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");
}
Ответ принят как подходящий

Сообщение об исключении предполагает, что вы передаете данные, которые не представляют массив 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

Я тоже пробовал это, очень похоже на второй способ Зафара в его ответе ниже.

J. Doe43 10.01.2019 18:43

Это сработало отлично, я случайно пропустил переменную в своем коде. Большое тебе спасибо!

J. Doe43 10.01.2019 21:19

Следующие классы данных генерируются для вашего 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
)

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

Другие вопросы по теме