Я все еще новичок в программировании на 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)
Так что же именно происходит? Вы получаете исключение JSONException? Вы получаете неверные данные?
@Egor Добавил информацию об ошибке logcat
Вы можете использовать jsonschema2pojo.org с GSON

Автоматическое создание класса данных
http://www.jsonschema2pojo.org/
Я полагаю, что ваш класс называется 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
Я тоже пробовал это, очень похоже на второй способ Зафара в его ответе ниже.
Это сработало отлично, я случайно пропустил переменную в своем коде. Большое тебе спасибо!
Следующие классы данных генерируются для вашего 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
)
Вот видео, который объясняет, как их реализовать при генерации.
Почему вы не используете библиотеку Gson?