【问题标题】:Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $ in kotlin使用 JsonReader.setLenient(true) 在 kotlin 中的第 1 行第 1 列路径 $ 接受格式错误的 JSON
【发布时间】:2022-02-03 15:29:16
【问题描述】:

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

我尝试了以下方法,但似乎无法解决问题。 How to fix 'Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $' error in Android StudioUse JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $

我收到另一个错误,java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $ from this error 使用 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()}")
                }
            })
        }
    }

接口 APIinsertData

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当前的简单信息来自response.body()。

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

【问题讨论】:

  • 投票反映了问题的有用性。它与你的学历无关。请注意,Stack Overflow 就像 Wikipedia。这不是免费的帮助台。请不要亲自投票。对您帖子的投票不会影响您的学习能力。请拨打tour了解更多信息。

标签: java android android-studio kotlin


【解决方案1】:

此响应来自您的服务器[DataModel(id=1, name=abc, alamal=cde, telepon=123), DataModel(id=4, name=adc, alamal=111, telepon=222)] 所以你为api设置response serializable是错误的,一定是这样的

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 响应将适用于您

【讨论】:

  • 谢谢。我试过你的方法。但我无法正确插入数据。我每次只插入一个DataModel数据,好像不是多个数据。我原来的 mysql 数据只是两个随机创建的。我不想再添加笔了。
  • 您的意思是可以正确发送到服务器吗? @LoveCing
  • 我得到 onFailure() 给我 Expected BEGIN_ARRAY 但在第 1 行第 1 列路径 $ 处是 STRING。
  • 我的代码更改是否用于接口 APIinsertData ?所以这个失败来你预期的对象,但你的服务器返回数组@LoveCing
  • 我将您的代码更改用于接口 APIinsertData。然后我获取失败,它说 Expected BEGIN_ARRAY 但在第 1 行第 1 列路径 $ 处是 STRING。
猜你喜欢
  • 2017-02-16
  • 2017-06-03
  • 2018-08-25
  • 1970-01-01
  • 2018-06-24
  • 1970-01-01
  • 2020-02-08
  • 2018-05-17
  • 1970-01-01
相关资源
最近更新 更多