当前位置: 首页 > 知识库问答 >
问题:

使用JsonReader。setLenient(true)在kotlin中的第1行第1列路径$处接受格式错误的JSON

韩佐
2023-03-14

我想通过php party将数据添加到MySQL。但是我一直失败。检查网站上的数据。仍然没有解决方案。我哪里出错了?

我尝试了以下方法,但似乎无法解决问题。如何修复“使用JsonReader”。setLenient(true)在Android Studio中的第1行第1列path$'错误处接受格式错误的JSON,并使用JsonReader。setLenient(true)在第1行第1列路径接受格式错误的JSON$

我得到了另一个错误,java.lang.IllegalStateException:预期BEGIN_OBJECT但在第1行第1列路径$上是STRING从这个错误使用JsonReader.setLenient(true)在第1行第1列路径$上接受格式错误的JSON。添加GsonBuilder()。

我使用//。。。使代码最小化。

依赖项

implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation "com.squareup.okhttp3:logging-interceptor:3.3.1"
implementation 'com.google.code.gson:gson:2.8.5'

布局

<EditText
    android:id="@+id/editText1"
    //... />

<EditText
    android:id="@+id/editText2"
    //... />

<EditText
    android:id="@+id/editText3"
    //... />

<Button
    android:id="@+id/buttonInsert"
    //...
     />

主要活动

    class MainActivity : AppCompatActivity() {
        //...
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            //...
            binding.buttonInsert.setOnClickListener {
insert(editText1.text.toString(),editText2.text.toString(),editText3.text.toString())
            }
        }
    
        fun insert(name:String,alamal:String,telepon:String){
            val ardData:APIinsertData = InsertServer().konekRetrofit2()!!.create(APIinsertData::class.java)
            val tampilData: Call<ResponseModel?>? = ardData.insertData(name,alamal,telepon)
            tampilData?.enqueue(object :Callback<ResponseModel?>{
                override fun onResponse(
                    call: Call<ResponseModel?>,
                    response: Response<ResponseModel?>
                ) {
                    //...
                }
    
                override fun onFailure(call: Call<ResponseModel?>, t: Throwable) {
                    Log.d("ex","==${t.message.toString()}")
                }
            })
        }
    }

接口API插入数据

interface APIinsertData {
    @FormUrlEncoded
    @POST("insert.php")
    open fun insertData(
        @Field("name")name:String,
        @Field("alamal")alamal:String,
        @Field("telepon")telepon:String
    ): Call<ResponseModel?>?
}

插入服务器

class InsertServer {
    private val baseURL="http://10.0.2.2/insertData/"
    private var retrofit: Retrofit?=null
    var gson = GsonBuilder()
        .setLenient()
        .create()

    fun konekRetrofit2(): Retrofit? {
        if (retrofit==null){
            retrofit= Retrofit.Builder()
                .baseUrl(baseURL)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build()
        }
        return retrofit
    }
}

数据类

data class DataModel (
    val id:Int,
    val name:String,
    val alamal:String,
    val telepon:String
        )
data class ResponseModel (
    val kode:Int,
    val pesan:String,
    val data:List<DataModel>
        )

MySql当前的简单信息来自响应。正文()。

[DataModel(id=1, name=abc, alamal=cde, telepon=123),
 DataModel(id=4, name=adc, alamal=111, telepon=222)]

共有1个答案

饶铭
2023-03-14

此响应来自您的服务器[数据模型(id=1,name=abc,alamal=cde,telepon=123),数据模型(id=4,name=adc,alamal=111,telepon=222)]所以您为api设置了可序列化的响应必须是这样的

interface APIinsertData {
@FormUrlEncoded
@POST("insert.php")
open fun insertData(
    @Field("name")name:String,
    @Field("alamal")alamal:String,
    @Field("telepon")telepon:String
): Call<List<DataModel>>?
}

像上面这样的更改insertData响应可以正常工作

 类似资料: