Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 嵌套数组和JSON的问题_Android_Json_Kotlin - Fatal编程技术网

Android 嵌套数组和JSON的问题

Android 嵌套数组和JSON的问题,android,json,kotlin,Android,Json,Kotlin,你好)我是Android开发的新手,我的程序有问题。 这是我的模型: data class Test (val id: Int, val numberQuestion: String, val question: String, val questionImageSrc: String, val examination: Boolean,

你好)我是Android开发的新手,我的程序有问题。 这是我的模型:

data class Test (val id: Int,
                 val numberQuestion: String,
                 val question: String,
                 val questionImageSrc: String,
                 val examination: Boolean,
                 val typeQuestion: String,
                 val singleChoiceAnswers: ArrayList<singleChoiceAnswer>,
                 val multipleChoiceAnswers: ArrayList<multipleChoiceAnswers>,
                 val inputAnswer: ArrayList<inputAnswer>)

data class multipleChoiceAnswers(val letter: String,
                                 val text: String,
                                 val correctAnswer: Boolean,
                                 val checked: Boolean)

data class singleChoiceAnswer(val letter: String,
                              val text: String,
                              val correctAnswer: Boolean,
                              val checked: Boolean)

data class inputAnswer(val correctAnswer: String,
                        val userAnswer: String)
我需要获取确定项的ArrayList,并使用bundle将其数据放入片段中。 但我在片段中遇到了一个问题:

 public override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?): View? {

        val rootView = inflater.inflate(R.layout.fragment2, container, false)

        val questionNumber = rootView.findViewById(R.id.questionNumber) as TextView
        val questionText = rootView.findViewById(R.id.Question) as TextView
        val questionImage = rootView.findViewById(R.id.questionImage) as ImageView

        val qN : String = getArguments()?.getString("NUMBER_KEY").toString()
        val quest: String = getArguments()?.getString("QUESTION_KEY").toString()
        val qI: String = getArguments()?.getString("IMAGE_KEY").toString()

        questionNumber.text=qN
        questionText.text=quest
        Picasso.get().load(qI).into(questionImage)

        val radioGroup = rootView.findViewById(R.id.radioGroupSetectTest) as RadioGroup

        val count : Int = getArguments()!!.getInt("COUNT_KEY")

        val context = getContext()

        for (i in 0 until count)
        {
            val curentRB = RadioButton(context)
            val curLetter = getArguments()?.getString("letterSCA$i")
            val curText = getArguments()?.getString("textSCA$i")


            curentRB.setText(curLetter+" "+curText)
            radioGroup.addView(curentRB)

        }
它会将SingleChooseSanswer的所有值都放在这样的所有项中。请帮帮我)我知道这是一个简单的问题,但我真的不明白)

(提前感谢)
顺便说一句,对不起我的英语)

首先,您需要将Json转换为Kotlin类,您可以使用 将json转换为如下所示的kotlin数据类

import android.os.Parcel
import android.os.Parcelable
import com.google.gson.annotations.SerializedName

data class QuestionResponse(

    @field:SerializedName("multipleChoiceAnswers")
    val multipleChoiceAnswers: List<MultipleChoiceAnswersItem?>? = null,

    @field:SerializedName("inputAnswer")
    val inputAnswer: List<InputAnswer?>? = null,

    @field:SerializedName("numberQuestion")
    val numberQuestion: String? = null,

    @field:SerializedName("question")
    val question: String? = null,

    @field:SerializedName("typeQuestion")
    val typeQuestion: String? = null,

    @field:SerializedName("examination")
    val examination: Boolean? = null,

    @field:SerializedName("id")
    val id: Int? = null,

    @field:SerializedName("singleChoiceAnswers")
    val singleChoiceAnswers: List<MultipleChoiceAnswersItem?>? = null,

    @field:SerializedName("questionImageSrc")
    val questionImageSrc: String? = null
) : Parcelable {
    constructor(parcel: Parcel) : this(
        parcel.createTypedArrayList(MultipleChoiceAnswersItem),
        parcel.createTypedArrayList(InputAnswer),
        parcel.readString(),
        parcel.readString(),
        parcel.readString(),
        parcel.readValue(Boolean::class.java.classLoader) as? Boolean,
        parcel.readValue(Int::class.java.classLoader) as? Int,
        parcel.createTypedArrayList(MultipleChoiceAnswersItem),
        parcel.readString()
    ) {
    }

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeTypedList(multipleChoiceAnswers)
        parcel.writeTypedList(inputAnswer)
        parcel.writeString(numberQuestion)
        parcel.writeString(question)
        parcel.writeString(typeQuestion)
        parcel.writeValue(examination)
        parcel.writeValue(id)
        parcel.writeTypedList(singleChoiceAnswers)
        parcel.writeString(questionImageSrc)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<QuestionResponse> {
        override fun createFromParcel(parcel: Parcel): QuestionResponse {
            return QuestionResponse(parcel)
        }

        override fun newArray(size: Int): Array<QuestionResponse?> {
            return arrayOfNulls(size)
        }
    }
}


import android.os.Parcel
import android.os.Parcelable
import com.google.gson.annotations.SerializedName

data class MultipleChoiceAnswersItem(

    @field:SerializedName("letter")
    val letter: String? = null,

    @field:SerializedName("checked")
    val checked: Boolean? = null,

    @field:SerializedName("text")
    val text: String? = null,

    @field:SerializedName("correctAnswer")
    val correctAnswer: Boolean? = null
) : Parcelable {
    constructor(parcel: Parcel) : this(
        parcel.readString(),
        parcel.readValue(Boolean::class.java.classLoader) as? Boolean,
        parcel.readString(),
        parcel.readValue(Boolean::class.java.classLoader) as? Boolean
    ) {
    }

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeString(letter)
        parcel.writeValue(checked)
        parcel.writeString(text)
        parcel.writeValue(correctAnswer)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<MultipleChoiceAnswersItem> {
        override fun createFromParcel(parcel: Parcel): MultipleChoiceAnswersItem {
            return MultipleChoiceAnswersItem(parcel)
        }

        override fun newArray(size: Int): Array<MultipleChoiceAnswersItem?> {
            return arrayOfNulls(size)
        }
    }
}



import android.os.Parcel
import android.os.Parcelable
import com.google.gson.annotations.SerializedName

data class InputAnswer(
    @field:SerializedName("correctAnswer")
    val correctAnswer: String? = null,

    @field:SerializedName("userAnswer")
    val userAnswer: String? = null) : Parcelable {
    constructor(parcel: Parcel) : this(
        parcel.readString(),
        parcel.readString()
    ) {
    }

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeString(correctAnswer)
        parcel.writeString(userAnswer)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<InputAnswer> {
        override fun createFromParcel(parcel: Parcel): InputAnswer {
            return InputAnswer(parcel)
        }

        override fun newArray(size: Int): Array<InputAnswer?> {
            return arrayOfNulls(size)
        }
    }
}
然后在片段中

public override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?): View? {

    val rootView = inflater.inflate(R.layout.fragment2, container, false)

    val questionNumber = rootView.findViewById(R.id.questionNumber) as TextView
    val questionText = rootView.findViewById(R.id.Question) as TextView
    val questionImage = rootView.findViewById(R.id.questionImage) as ImageView

    val item = arguments.getParcelable("input")
    // val arraylist = arguments.getParcelableArrayList<YOUR_CLASS_TYPE>("key") //for arrays you can do it like this
    //then set it in the radiobutton like this item.getCurrentText and so on
}
public-override-onCreateView(
充气机,
容器:视图组?,
savedInstanceState:捆绑?:查看?{
val rootView=充气机。充气(右布局。碎片2,容器,错误)
val questionNumber=rootView.findViewById(R.id.questionNumber)作为文本视图
val questionText=rootView.findViewById(R.id.Question)作为TextView
val questionImage=rootView.findviewbyd(R.id.questionImage)作为ImageView
val item=arguments.getParcelable(“输入”)
//val arraylist=arguments.getParcelableArrayList(“key”)//对于数组,可以这样做
//然后在单选按钮中设置它,如item.getCurrentText等
}

你能告诉我片段中有什么问题吗?@theanilpaudel最有可能的问题是在我将值放入片段的循环中。我只需要放一个数组singleChoiceAnswer,但它放了JSON中的所有sinleCHoceArray,看看屏幕
import android.os.Parcel
import android.os.Parcelable
import com.google.gson.annotations.SerializedName

data class QuestionResponse(

    @field:SerializedName("multipleChoiceAnswers")
    val multipleChoiceAnswers: List<MultipleChoiceAnswersItem?>? = null,

    @field:SerializedName("inputAnswer")
    val inputAnswer: List<InputAnswer?>? = null,

    @field:SerializedName("numberQuestion")
    val numberQuestion: String? = null,

    @field:SerializedName("question")
    val question: String? = null,

    @field:SerializedName("typeQuestion")
    val typeQuestion: String? = null,

    @field:SerializedName("examination")
    val examination: Boolean? = null,

    @field:SerializedName("id")
    val id: Int? = null,

    @field:SerializedName("singleChoiceAnswers")
    val singleChoiceAnswers: List<MultipleChoiceAnswersItem?>? = null,

    @field:SerializedName("questionImageSrc")
    val questionImageSrc: String? = null
) : Parcelable {
    constructor(parcel: Parcel) : this(
        parcel.createTypedArrayList(MultipleChoiceAnswersItem),
        parcel.createTypedArrayList(InputAnswer),
        parcel.readString(),
        parcel.readString(),
        parcel.readString(),
        parcel.readValue(Boolean::class.java.classLoader) as? Boolean,
        parcel.readValue(Int::class.java.classLoader) as? Int,
        parcel.createTypedArrayList(MultipleChoiceAnswersItem),
        parcel.readString()
    ) {
    }

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeTypedList(multipleChoiceAnswers)
        parcel.writeTypedList(inputAnswer)
        parcel.writeString(numberQuestion)
        parcel.writeString(question)
        parcel.writeString(typeQuestion)
        parcel.writeValue(examination)
        parcel.writeValue(id)
        parcel.writeTypedList(singleChoiceAnswers)
        parcel.writeString(questionImageSrc)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<QuestionResponse> {
        override fun createFromParcel(parcel: Parcel): QuestionResponse {
            return QuestionResponse(parcel)
        }

        override fun newArray(size: Int): Array<QuestionResponse?> {
            return arrayOfNulls(size)
        }
    }
}


import android.os.Parcel
import android.os.Parcelable
import com.google.gson.annotations.SerializedName

data class MultipleChoiceAnswersItem(

    @field:SerializedName("letter")
    val letter: String? = null,

    @field:SerializedName("checked")
    val checked: Boolean? = null,

    @field:SerializedName("text")
    val text: String? = null,

    @field:SerializedName("correctAnswer")
    val correctAnswer: Boolean? = null
) : Parcelable {
    constructor(parcel: Parcel) : this(
        parcel.readString(),
        parcel.readValue(Boolean::class.java.classLoader) as? Boolean,
        parcel.readString(),
        parcel.readValue(Boolean::class.java.classLoader) as? Boolean
    ) {
    }

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeString(letter)
        parcel.writeValue(checked)
        parcel.writeString(text)
        parcel.writeValue(correctAnswer)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<MultipleChoiceAnswersItem> {
        override fun createFromParcel(parcel: Parcel): MultipleChoiceAnswersItem {
            return MultipleChoiceAnswersItem(parcel)
        }

        override fun newArray(size: Int): Array<MultipleChoiceAnswersItem?> {
            return arrayOfNulls(size)
        }
    }
}



import android.os.Parcel
import android.os.Parcelable
import com.google.gson.annotations.SerializedName

data class InputAnswer(
    @field:SerializedName("correctAnswer")
    val correctAnswer: String? = null,

    @field:SerializedName("userAnswer")
    val userAnswer: String? = null) : Parcelable {
    constructor(parcel: Parcel) : this(
        parcel.readString(),
        parcel.readString()
    ) {
    }

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeString(correctAnswer)
        parcel.writeString(userAnswer)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<InputAnswer> {
        override fun createFromParcel(parcel: Parcel): InputAnswer {
            return InputAnswer(parcel)
        }

        override fun newArray(size: Int): Array<InputAnswer?> {
            return arrayOfNulls(size)
        }
    }
}
private fun jsonResult(jsonString: String?) {

    val jsonArray = JSONArray(jsonString)

    val list = ArrayList<QuestionResponse>()
    val slist = ArrayList<MultipleChoiceAnswersItem>()
    val mlist = ArrayList<MultipleChoiceAnswersItem>()
    val ilist = ArrayList<InputAnswer>()

    for (i in 0 until jsonArray.length()){
        val jsonObject = jsonArray.getJSONObject(i)
        val typeQuestion = jsonObject.getString("typeQuestion")

        val curentId = jsonObject.optInt("id")
        val curentNQ = jsonObject.optString("numberQuestion")
        val curentQ = jsonObject.optString("question")
        val curentQIS = jsonObject.optString("questionImageSrc")
        val curentEx = jsonObject.optBoolean("examination")



        if (typeQuestion.contains("multipleChoice")){
            val multipleChoiceAnswers = jsonObject.getJSONArray("multipleChoiceAnswers")

            for (sc in 0 until multipleChoiceAnswers.length()){



                val curentMCA = multipleChoiceAnswers.getJSONObject(sc)
                val letter = curentMCA.optString("letter")
                val text = curentMCA.optString("text")
                val correctAnswer = curentMCA.optBoolean("correctAnswer")
                val checked = curentMCA.optBoolean("checked")



                mlist.add(MultipleChoiceAnswersItem(letter,checked, text, correctAnswer))
            }

        }
        if (typeQuestion.contains("singleChoice")){
            val singleChoiceAnswer = jsonObject.getJSONArray("singleChoiceAnswers")

            for (sc in 0 until singleChoiceAnswer.length()){
                val curentSCA = singleChoiceAnswer.getJSONObject(sc)
                val letter = curentSCA.optString("letter")
                val text = curentSCA.optString("text")
                val correctAnswer = curentSCA.optBoolean("correctAnswer")
                val checked = curentSCA.optBoolean("checked")

                slist.add(MultipleChoiceAnswersItem(letter, checked,text, correctAnswer))
            }


        }
        if (typeQuestion.contains("input")){
            val inputAnswer = jsonObject.getJSONArray("inputAnswer")

            for (sc in 0 until inputAnswer.length()){
                val curentIA = inputAnswer.getJSONObject(sc)
                val correctAnswer = curentIA.optString("correctAnswer")
                val userAnswer = curentIA.optString("userAnswer")

                ilist.add(InputAnswer(correctAnswer,userAnswer))
            }
        }

        val questionResponse = QuestionResponse(mlist,ilist,curentNQ,curentQ,typeQuestion,curentEx,curentId,slist,curentQIS)

        //pass this questionResponse to your adapter


    }




}
private fun testAdapterItemClick(item: Test) {

    val fT: FragmentTransaction = supportFragmentManager.beginTransaction()

    val frag1: Fragment1 = Fragment1()
    val frag2: Fragment2 = Fragment2()

    if (item.typeQuestion == "input") {
        val bundle = Bundle()
        bundle.putParcelable("input", item)

        frag1.setArguments(bundle)
        fT.add(R.id.frameLayout, frag1)
    }
    // do the same for the rest
}
public override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?): View? {

    val rootView = inflater.inflate(R.layout.fragment2, container, false)

    val questionNumber = rootView.findViewById(R.id.questionNumber) as TextView
    val questionText = rootView.findViewById(R.id.Question) as TextView
    val questionImage = rootView.findViewById(R.id.questionImage) as ImageView

    val item = arguments.getParcelable("input")
    // val arraylist = arguments.getParcelableArrayList<YOUR_CLASS_TYPE>("key") //for arrays you can do it like this
    //then set it in the radiobutton like this item.getCurrentText and so on
}