gson 如何正确解析数据到我的翻新客户端,以便执行发布请求[复制]

sirbozc5  于 2022-11-06  发布在  其他
关注(0)|答案(1)|浏览(171)

此问题在此处已有答案

"Expected BEGIN_OBJECT but was STRING at line 1 column 1"(20个答案)
去年关闭了。
我试图通过一个POST请求发送JSON到Retrofit的一个rest API。我遇到的问题是,我似乎不能弄清楚/使用Retrofit想要的数据类型(JSONArray, String, INT ...etc),以便它POST到我的rest API。到目前为止,我只是尝试将JSON硬编码为字符串,并解析为Retrofit,希望它可以发布到其他API,并与我的类型混淆。我用来改进POST输入
当我尝试解析一个字符串时,我得到了以下结果:com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $这个错误说明我没有解析JSON。问题是我不知道要解析什么。
当我试图解析JSONarray或JSONobject或任何其他类型的数据时,我的应用程序视图将无法加载,并且我的应用程序将崩溃。
我的code

interface SimpleApi {
    @POST("posttest.php")
    suspend fun postit(@Body post: String): Phone
}

这是我的改进API。字符串值是我认为给我带来麻烦的一个,电话类是我用于我的recylerview的数据类。

private fun TestGet() {
        val gson = GsonBuilder()
                .setLenient()
                .create()

        val api = Retrofit.Builder()
                    .baseUrl(BASE_URL)
                  .addConverterFactory(GsonConverterFactory.create(gson))
                    .build()
                    .create(SimpleApi::class.java)

            GlobalScope.launch(Dispatchers.IO) {
                val response = api.postit(test)//it wants a JSONarray
                //the above wants some kind of JSON to work I was passing Strings instead
                try {
                  //here lies the app logic and recylerview setup
                }catch (e: Exception){
                    println("you messed up the connection some how")
                }
            }
    }

这个函数就是我调用我的restAPI、解析和返回JSON以及处理业务逻辑的方法。
现在变量test已经有了一些东西,最初它只是一个硬编码的字符串,就像private var test = "[\"text1\", \"text2\", \"text3\"]"private var test = """["text1", "text2", "text3"]"""一样,这不起作用,我也尝试过实现一个GSON转换器,如上所述,这不起作用。
谢谢你抽出时间。

EDIT如果没有addConverterFactory(GsonConverterFactory.create(gson)),我会得到以下错误FATAL EXCEPTION: DefaultDispatcher-worker-1com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $

jtw3ybtb

jtw3ybtb1#

.addConverterFactory(GsonConverterFactory.create(gson)),当被应用时,意味着retrofit将把你作为Json对象传递的每个有效负载处理。所以,当你传递一个简单的字符串时,你会得到这个错误。一个可能的修复方法是将你的字符串数组转换为json数组,如这里所解释的https://stackoverflow.com/a/10498107/404438
同时检查服务器响应是否是有效的json,您可以通过添加日志拦截器来实现这一点。
下面是添加拦截器的方法:
首先,在你房子里。

implementation "com.squareup.retrofit2:retrofit:2.6.0"
    implementation "com.squareup.retrofit2:converter-gson:2.6.0"
    implementation "com.squareup.okhttp3:logging-interceptor:3.11.0"

然后道:

val gson = GsonBuilder()
                .setLenient()
                .create()

  val builder = OkHttpClient().newBuilder()
        builder.readTimeout(120, TimeUnit.SECONDS)
        builder.connectTimeout(30, TimeUnit.SECONDS)

        if (BuildConfig.DEBUG) {
            val interceptor = HttpLoggingInterceptor()
            interceptor.level = HttpLoggingInterceptor.Level.BASIC
            builder.addInterceptor(interceptor)
        }
  val client = builder.build()

  val retrofit = Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create(gson))
                .client(client)
                .build()

相关问题