【问题标题】:How to solve retrofit Conversion Exception when converting to json string转换为json字符串时如何解决改造转换异常
【发布时间】:2016-11-02 03:23:27
【问题描述】:

我正在尝试向 api 发布一组参数,但我收到了一个我不太理解的错误

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

我怀疑可能导致此错误的三个方面

  1. 我要么错误地声明了最后一个参数

    @Query("AppTimes") 字符串应用时间

  2. 我的 Gson 转换结果不正确,也许我应该使用另一个转换器

  3. 无法将 java 列表转换为 json

这就是我的休息适配器的样子

public static DigitechService createService(Context context)
   {
      Gson gson = new GsonBuilder()
            //.setDateFormat("yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'SSS'Z'")
            .setDateFormat("yyyy-MM-dd'T'HH:mm:ss") // 2015-02-23T00:00:00
            .create();

      // Only allow LogLevel for Debug
      RestAdapter restAdapter = new RestAdapter.Builder()
            .setLogLevel(Globals.TEST == false ? RestAdapter.LogLevel.NONE : RestAdapter.LogLevel.FULL)
            .setEndpoint(Globals.digitechApiBaseUrl)
            .setConverter(new GsonConverter(gson))
            .setRequestInterceptor(new AuthRequestInterceptor(context))
            .build();

      return restAdapter.create(DigitechService.class);
   }

这是我的界面

@POST("/api/v1/LoadAppTimeUsage/")
    void loadAppTimeUsage(
            @Query("cellPhoneNumber") String cellPhoneNumber,
            @Query("appName") String appName,
            @Query("timeSpent") int timeSpent,
            @Query("AppTimes") String appTimes,
            Callback<List<ResultPost>> cb
    );

我的发帖方式

public List<AppTimeUsage> postAppTimeUsage(List<AppTimeUsage> atu)
    {
        String json = new Gson().toJson(atu);
        TinyDB settings = new TinyDB(mContext);
        // Show progress
       final ProgressDialog progress = new ProgressDialog(mContext);
        progress.setOnCancelListener(new DialogInterface.OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialog) {

            }
        });
        progress.show();


        String cellphoneNumber = settings.getString(AppPreferences.CONFIRMED_CellPhoneNUmber);


        DigiTechClient.createService(mContext).loadAppTimeUsage(cellphoneNumber, appName ,timeSpent,  json, new Callback<List<ResultPost>>() {
            @Override
            public void success(List<ResultPost> resultPosts, Response response) {
                if (progress != null) progress.dismiss();
            }

            @Override
            public void failure(RetrofitError error) {
                if (progress != null) progress.dismiss();

                DeviceApp.handleError(error);

                if (error.getResponse() != null) {
                    RestError err = (RestError) error.getBodyAs(RestError.class);

                    Toast.makeText(mContext, err.Message, Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(mContext, error.getMessage(), Toast.LENGTH_LONG).show();
                }
            }
        });
        return atu;
    }

我的 StackTrace

    java.lang.RuntimeException: retrofit.converter.ConversionException: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
at com.xera.deviceinsight.structs.AppTimeUsageRecorder$2.failure(AppTimeUsageRecorder.java:163)
at retrofit.CallbackRunnable$2.run(CallbackRunnable.java:53)
at android.os.Handler.handleCallback(Handler.java:730)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:176)
at android.app.ActivityThread.main(ActivityThread.java:5419)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:525)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862)
at dalvik.system.NativeStart.main(Native Method)
Caused by: retrofit.converter.ConversionException: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
at retrofit.converter.GsonConverter.fromBody(GsonConverter.java:67)
at retrofit.RetrofitError.getBodyAs(RetrofitError.java:137)
at com.xera.deviceinsight.structs.AppTimeUsageRecorder$2.failure(AppTimeUsageRecorder.java:163) 
at retrofit.CallbackRunnable$2.run(CallbackRunnable.java:53) 
at android.os.Handler.handleCallback(Handler.java:730) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:176) 
at android.app.ActivityThread.main(ActivityThread.java:5419) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:525) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:200)
at com.google.gson.Gson.fromJson(Gson.java:810)
at com.google.gson.Gson.fromJson(Gson.java:775)
at retrofit.converter.GsonConverter.fromBody(GsonConverter.java:63)
at retrofit.RetrofitError.getBodyAs(RetrofitError.java:137) 
at com.xera.deviceinsight.structs.AppTimeUsageRecorder$2.failure(AppTimeUsageRecorder.java:163) 
at retrofit.CallbackRunnable$2.run(CallbackRunnable.java:53) 
at android.os.Handler.handleCallback(Handler.java:730) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:176) 
at android.app.ActivityThread.main(ActivityThread.java:5419) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:525) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862) 
at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:387)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:189)
at com.google.gson.Gson.fromJson(Gson.java:810) 
at com.google.gson.Gson.fromJson(Gson.java:775) 
at retrofit.converter.GsonConverter.fromBody(GsonConverter.java:63) 
at retrofit.RetrofitError.getBodyAs(RetrofitError.java:137) 
at com.xera.deviceinsight.structs.AppTimeUsageRecorder$2.failure(AppTimeUsageRecorder.java:163) 
at retrofit.CallbackRunnable$2.run(CallbackRunnable.java:53) 
at android.os.Handler.handleCallback(Handler.java:730) 
at android.os.Handler.dispatchMessage(Handler.java:92) 
at android.os.Looper.loop(Looper.java:176) 
at android.app.ActivityThread.main(ActivityThread.java:5419) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:525) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1046) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:862) 
at dalvik.system.NativeStart.main(Native Method) 

【问题讨论】:

  • 您使用哪个版本的 Retrofit?您的回调将是您界面中方法的返回类型。很可能是特定类型的呼叫。
  • 手动编辑任何json字符串都会在响应字符串中添加垃圾字符。从jsonformatter.curiousconcept.com验证json并下载json文件并再次检查。
  • @Tauqir 我检查了我的 gradle,看来我正在使用改造 1.9 compile 'com.squareup.retrofit:retrofit:1.9.0'

标签: java android json rest retrofit


【解决方案1】:

不要将参数转换为 JSON 字符串。相反,将列表对象作为正文参数发送,它将自动转换为 JSON。

举个例子:

@POST("/api/v1/LoadAppTimeUsage/")
void loadAppTimeUsage(
        @Body List<MyApp> appTimes,
        Callback<List<ResultPost>> cb
);

【讨论】:

    【解决方案2】:

    我认为是您的 gson 转换器出现问题。我的改装版本不同。我通过以下方式解决它: builder.addConverterFactory(GsonConverterFactory.create(Gsons.getGson())); 希望对你有帮助。

    【讨论】:

    • 你建议我升级到版本 2,你能提供一个链接,说明如何在不破坏项目当前结构的情况下做到这一点
    • @Tauqir 我使用 jsonformatter.curiousconcept.com 进行了验证,它表明它是一个有效的 json 我也尝试使用 json lint
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 2015-03-22
    • 2011-12-23
    • 2018-03-08
    • 2015-10-01
    相关资源
    最近更新 更多