此问题在此处已有答案:
"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-1
和com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $
1条答案
按热度按时间jtw3ybtb1#
行
.addConverterFactory(GsonConverterFactory.create(gson))
,当被应用时,意味着retrofit将把你作为Json对象传递的每个有效负载处理。所以,当你传递一个简单的字符串时,你会得到这个错误。一个可能的修复方法是将你的字符串数组转换为json数组,如这里所解释的https://stackoverflow.com/a/10498107/404438。同时检查服务器响应是否是有效的json,您可以通过添加日志拦截器来实现这一点。
下面是添加拦截器的方法:
首先,在你房子里。
然后道: