簡體   English   中英

JSON 錯誤“java.lang.IllegalStateException:應為 BEGIN_OBJECT 但在第 1 行第 1 列路徑 $ 處為 STRING”

[英]JSON Error "java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $"

public interface UserService {
    @POST(Constants.Api.URL_REGISTRATION)
    @FormUrlEncoded
    BaseWrapper registerUser(@Field("first_name") String firstname, @Field("last_name") String lastname, @Field("regNumber") String phone, @Field("regRole") int role);


 public BaseWrapper registerUser(User user) {
        return getUserService().registerUser(user.getFirstName(), user.getLastName(), user.getPhone(), user.getRole());
    }

這創建異常

 com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $

非常感謝您的幫助。

讓我們看看您收到的錯誤。

預期 BEGIN_OBJECT

您的 JSON 是一個對象,所有 JSON 對象都包含在花括號 ({}) 中。 因此 BEGIN_OBJECT 是 {。 它正在某處期待它。

但是是STRING

但相反,他發現了一個字符串“Something”。 仍然沒有告訴我們在哪里。

在第 1 行第 1 列路徑 $

啊,完美。 在第 1 行第 1 列。這是 JSON 的開始。 因此,您忘記將整個內容包含在 {} 中(或者至少您忘記了第一個,但我敢打賭您已經忘記了它們)。

清理和重建項目對我有用。

最近我遇到了類似的問題,只能通過在標題部分添加“接受:應用程序/json”來解決。 因此,如果您使用的是改造 2.0;

第一個解決方案:對於 post 方法添加 headers 參數,如下所示;

@Headers({"Accept: application/json"})
@POST(Constants.Api.URL_REGISTRATION)
@FormUrlEncoded
BaseWrapper registerUser(@Field("first_name") String firstname, 
                         @Field("last_name") String lastname, 
                         @Field("regNumber") String phone, 
                         @Field("regRole") int role);

第二種解決方案:像這樣將標頭添加到攔截器類中;

注意:代碼在 kotlin 中

private fun getInterceptor(): Interceptor {
        try {
            return Interceptor {
                val request = it.request()
                it.proceed(
                    request.newBuilder()
                        .header("Accept", "application/json")
                        .header("Authorization", "$accessTokenType $accessToken")
                        .build()
                )
            }
        } catch (exception: Exception) {
            throw Exception(exception.message)
        }
    }
}

希望它有幫助,快樂編碼:)

如果要在 json 對象中添加 ArrayList 並在 GSON 中解析,請確保 ArrayList 應如下所示。

ArrayList<JSONObject>

代替

ArrayList<String>

並像這樣解析。

ArrayList<JSONObject> mItem = new ArrayList<JSONObject>();
mItem.add(jsonObject);

// and Use like this.
JSONArray list = new JSONArray(mItem);
jsonObject.put("Item",list);

如果您的應用使用先前版本的存儲數據並且您更改了數據類型,您可能會遇到此錯誤。

例如:我在以前的版本中將某些內容存儲為字符串。 后來我將其中存儲了數據的類更新為對象類型。 當我運行它時,我收到了這個錯誤。 清除應用數據或重新安裝后,錯誤消失。

清除應用程序數據可能很容易解決。

解決方案

在 Kotlin 中我們可以使用 ResponseBody 的 Response 並在其中管理初始響應。

viewModelScope.launch(Dispatchers.IO) {
        mainRepository.getAPIData(
            Constants.getRequestBody(requestBody.toString())
        ).let { it ->
            if (it.isSuccessful && it.code() == 200) {
                val responseBody = it.body()
                val res: String? = responseBody?.string()
                try {
                    val main = JSONObject(res!!)
                    Log.e("TAG", "onSuccess: " + main.toString())
                    if (main.getInt("StatusCode") == 200) {
                        val type = object : TypeToken<Response>() {}.type
                        val response: Response = Gson().fromJson(
                            main.toString(), type
                        )
                        Log.e("TAG", "onSuccess: " + response.toString())
                    } else {
                        apiResponseData.postValue(Resource.error(main.getString("Message"), null))
                        Log.e("TAG", "onFail: " + main.toString())
                    }
                } catch (exception: JSONException) {
                    Log.e("TAG", "Exception: " + exception.message)
                }
            }
        }
    }

響應 - Retrofit

ResponseBody-okHttp

響應是實際的 model 響應例如 UserResponse

在這里,getAPIData() 是 API 調用,它返回 ResponseBody 的 Response

apiResponseData是 MutableLiveData

使用它可以避免響應中的 JSON 類型轉換錯誤。

這是一個proguard問題。 在發布 minifyEnabled true 時打破了 API 模型。 您需要在 ResponseModel 和 RequestModel 中添加 Serializable API

https://i.stack.imgur.com/uHN22.png

清理並重建項目 這是由於 Gson 文件有些混亂造成的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM