Android Kotlin解析嵌套JSON

Android Kotlin解析嵌套JSON,json,parsing,kotlin,Json,Parsing,Kotlin,我对使用Kotlin编程仍然相当陌生,但我似乎无法找到解析JSON的正确方法。我正在尝试仅从“unackd”数组中的“notification”获取“title”和“body” 到目前为止,我已经: private fun parse(): Boolean { try { val ja = JSONArray(jsonData) var jo: JSONObject users.clear() var user: User

我对使用Kotlin编程仍然相当陌生,但我似乎无法找到解析JSON的正确方法。我正在尝试仅从“unackd”数组中的“notification”获取“title”和“body”

到目前为止,我已经:

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"
        }
    }
]
}
我相信我的问题是进入“通知”,然后得到字符串“标题”和“正文”。我试过了

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)
org.json.json.typeMismatch(json.java:111)上的

位于org.json.JSONArray(JSONArray.java:96)
位于org.json.JSONArray(JSONArray.java:108)
位于android.os.AsyncTask$2.call(AsyncTask.java:333)
在java.util.concurrent.FutureTask.run(FutureTask.java:266)处
在android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
运行(Thread.java:764)
  • 自动生成数据类

  • 我假设您的类名为Response.java

    Response object=new Gson().fromjson(jsonContentFile,Response.class)

  • 自动生成数据类

  • 我假设您的类名为Response.java

    Response object=new Gson().fromjson(jsonContentFile,Response.class)


  • 听着,朋友,用带有键的JSON数组(比如:unackd,ackd)解析JSON对象非常简单

    有两种方法:

    第一路) 将JSON解析为Pojo模式

    无需为解析创建所有类(如ackd(Json数组))

    第二条道路)

    您需要解析名为unackd而不是ackd的JSON数组

    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");
    }
    
    String jsonStr=sh.makeServiceCall(url);
    JSONObject jsonObj=新的JSONObject(jsonStr);
    //获取JSON数组节点
    JSONArray unA=jsonObj.getJSONArray(“unackd”);
    对于(int i=0;i
    听朋友说,用带有键的JSON数组(比如:unackd,ackd)解析JSON对象非常简单

    有两种方法:

    第一路) 将JSON解析为Pojo模式

    无需为解析创建所有类(如ackd(Json数组))

    第二条道路)

    您需要解析名为unackd而不是ackd的JSON数组

    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");
    }
    
    String jsonStr=sh.makeServiceCall(url);
    JSONObject jsonObj=新的JSONObject(jsonStr);
    //获取JSON数组节点
    JSONArray unA=jsonObj.getJSONArray(“unackd”);
    对于(int i=0;i
    当实例化
    JSONArray
    时,异常消息表明您正在传递不表示JSON数组的数据:

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

    当实例化
    JSONArray
    时,异常消息表明您正在传递不表示JSON数组的数据:

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

    以下数据类是使用


    这说明了如何在生成时实现这些功能。

    以下数据类是使用


    这就解释了如何在生成时实现这些功能。

    为什么不使用Gson库呢?那么到底会发生什么呢?你是否收到了JSONException?您是否得到错误的数据?@Egor添加了logcat错误信息您可以使用Gson为什么不使用Gson库?那么到底发生了什么?你是否收到了JSONException?你得到了错误的数据吗?@Egor添加了logcat错误信息,你可以用在GSONI身上。你也试过了,看起来很像下面zafar回答的第二种方法。这很好,我不小心忽略了代码中的一个变量。非常感谢你!我也试过了,看起来很像zafar在下面的回答中的第二种方式。效果很好,我不小心忽略了代码中的一个变量。非常感谢你!
    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
    )