【问题标题】:Retrofit2.0 gets MalformedJsonException while the json seems correct?Retrofit2.0 得到 MalformedJsonException 而 json 似乎正确?
【发布时间】:2016-06-29 08:03:08
【问题描述】:

我正在为我的 Android 应用程序使用 retrofit:2.0.0-beta4。

我尝试使用 Retrofit 添加用户,该用户已在数据库中正确创建,但出现以下错误:

03-14 06:04:27.731 30572-30600/com.lehuo.lehuoandroid D/OkHttp: CALLING POST SP_User_CreateUser....your new user_id:48
{"data":{"user_id":"48","nickname":null,"password":null,"status":null},"status":1,"msg":"OK"}
03-14 06:04:27.731 30572-30600/com.lehuo.lehuoandroid D/OkHttp: <-- END HTTP (147-byte body)
03-14 06:04:27.732 30572-30600/com.lehuo.lehuoandroid E/My Jobs: error while executing job
     com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 1 path $
         at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1573)
         at com.google.gson.stream.JsonReader.checkLenient(JsonReader.java:1423)
         at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:587)
         at com.google.gson.stream.JsonReader.peek(JsonReader.java:429)
         at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:202)
         at com.google.gson.TypeAdapter.fromJson(TypeAdapter.java:260)
         at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:32)
         at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:23)
         at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:213)
         at retrofit2.OkHttpCall.execute(OkHttpCall.java:177)
         at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall.execute(ExecutorCallAdapterFactory.java:87)
         at com.lehuo.lehuoandroid.async.NetworkJob.callNet(NetworkJob.java:30)
         at com.lehuo.lehuoandroid.async.CreateUserJob.onRun(CreateUserJob.java:34)
         at com.path.android.jobqueue.BaseJob.safeRun(BaseJob.java:108)
         at com.path.android.jobqueue.JobHolder.safeRun(JobHolder.java:60)
         at com.path.android.jobqueue.executor.JobConsumerExecutor$JobConsumer.run(JobConsumerExecutor.java:201)
         at java.lang.Thread.run(Thread.java:818)

服务器返回的结果是:

{"data":{"user_id":"48","nickname":null,"password":null,"status":null},"status":1,"msg":"OK"}

这是正确的json格式,我不明白为什么会出现这种异常?

这里是我的界面:

public class ApiResult<T> {
    public T data;
    public int status;
    public String msg;
}

public interface ApiUsers {
    @POST("/users/new")
    public Call<ApiResult<User>> createUser(@Body User user);
}

public class User {
    public int user_id;
    public String registration;
    public int registration_type;
    public String avatar;
    public String nickname;
    public String password;
    public String status;

}

public class Api {

    // TODO modify the value
    public static final String BASE_URL = "xxx";

    private static Api instance = new Api();

    public static Api getInstance() {
        return instance;
    }

    private Api(){}

    public Retrofit getRetrofit() {
        HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
        interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
        OkHttpClient client = new OkHttpClient.Builder()
                .addInterceptor(interceptor)
                .retryOnConnectionFailure(true)
                .connectTimeout(15, TimeUnit.SECONDS)
                .build();

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .client(client)
                .addConverterFactory(GsonConverterFactory.create())
                .build();

        return retrofit;
    }

    public <S> S createService(Class<S> serviceClass) {
        return getRetrofit().create(serviceClass);
    }
}

调用者代码是:

ApiUsers api = Api.getInstance().createService(ApiUsers.class);
Call<ApiResult<User>> call = api.createUser(user);
CreateUserMessage message = new CreateUserMessage();
callNet(call, message);

谁能给点线索?

【问题讨论】:

  • 一些字符,例如 NUL \0 也可能导致这种情况,我们在调试中看不到这个字符。尝试使用宽松模式。
  • 另外添加您正在初始化 retorofit 的代码,即您的 Api.getInstance()User
  • @vedant1811,很遗憾,我没有找到编写自定义gson转换器的教程,请查看这里futurestud.io/blog/…,尚未发布。
  • user_id 从 web 服务获取字符串,并且您的界面转换为整数。请检查一下。

标签: android json gson retrofit retrofit2


【解决方案1】:

最后我解决了与 json 宽松模式无关的问题,我的 POST 响应有问题(在 json 数据之前还有一些其他非 json 输出)。

以下是 JakeWharton 关于如何设置 Gson 宽松模式的回复:

确保你有:compile 'com.google.code.gson:gson:2.6.1'

Gson gson = new GsonBuilder()
        .setLenient()
        .create();

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

【讨论】:

  • 不工作,作为我在 XML 数据中的响应,我尝试了所有可能的方法
  • 实施此解决方案后,我仍然遇到同样的错误。你能给我一些解决这个错误的指示吗?我正在使用改造 2 并处理 JSON 而不是 XML
  • 虽然我没有尝试但可以帮助到某人。试试this
【解决方案2】:

我通过从我的 JSON 文件中删除多余的 HTML 文本和其他空格解决了我的问题。

【讨论】:

  • 请告诉我怎么做?
  • @roghayehhosseini 我的 JSON 文件中几乎没有多余的空格,这就是我收到 Malformed JSON Exception 错误的原因。然后我删除了所有多余的空格。
【解决方案3】:

我解决了问题

Gson gson = new GsonBuilder().setLenient().create();

OkHttpClient client = new OkHttpClient();

Retrofit retrofit = new Retrofit.Builder()
    .baseUrl("http://kafe.netai.net/")
    .client(client)
    .addConverterFactory(GsonConverterFactory.create(gson))
    .build();



compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
compile 'com.google.code.gson:gson:2.7'

【讨论】:

  • @TotZam 哈哈哈!这里的代码是未格式化的! :D :D
  • 嗯,所以我也会尝试将我的代码写在一行中 - 可能会解决问题))
猜你喜欢
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多