您的位置:首页 > Web前端 > JavaScript

MalformedJsonException with Retrofit API?

2015-12-24 13:25 302 查看
com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException

com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient

在使用Retrofit解析数据的时候有可能遇到MalformedJsonException json格式不严谨

在这里,我给自定义

GsonConverterFactory

1:请求体,可修改 拦截


package com.retrofit.test.retrofit;

import com.google.gson.Gson;
import com.squareup.okhttp.MediaType;
import com.squareup.okhttp.RequestBody;

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.lang.reflect.Type;
import java.nio.charset.Charset;

import okio.Buffer;
import retrofit.Converter;

/**
* ClassName GsonRequestBodyConverter
* Description
* Company
* author  youxuan  E-mail:xuanyouwu@163.com
* date createTime:2015/12/24 12:39
* version
*/
public class GsonRequestBodyConverter<T> implements Converter<T, RequestBody> {
private static final MediaType MEDIA_TYPE = MediaType.parse("application/json; charset=UTF-8");
private static final Charset UTF_8 = Charset.forName("UTF-8");

private final Gson gson;
private final Type type;

GsonRequestBodyConverter(Gson gson, Type type) {
this.gson = gson;
this.type = type;
}

@Override public RequestBody convert(T value) throws IOException {
Buffer buffer = new Buffer();
Writer writer = new OutputStreamWriter(buffer.outputStream(), UTF_8);
try {
gson.toJson(value, type, writer);
writer.flush();
} catch (IOException e) {
throw new AssertionError(e); // Writing to Buffer does no I/O.
}
return RequestBody.create(MEDIA_TYPE, buffer.readByteString());
}
}
</pre><pre name="code" class="java">
</pre>2: 响应体解析<p></p><p></p><pre name="code" class="java">package com.retrofit.test.retrofit;

import com.google.gson.Gson;
import com.google.gson.stream.JsonReader;
import com.squareup.okhttp.ResponseBody;

import java.io.Closeable;
import java.io.IOException;
import java.io.Reader;
import java.lang.reflect.Type;

import retrofit.Converter;

/**
* ClassName GsonResponseBodyConverter
* Description
* Company
* author  youxuan  E-mail:xuanyouwu@163.com
* date createTime:2015/12/24 12:39
* version
*/
public class GsonResponseBodyConverter<T> implements Converter<ResponseBody, T> {
private final Gson gson;
private final Type type;

GsonResponseBodyConverter(Gson gson, Type type) {
this.gson = gson;
this.type = type;
}

@Override
public T convert(ResponseBody value) throws IOException {
Reader reader = value.charStream();
try {

JsonReader jsonReader = new JsonReader(reader);
jsonReader.setLenient(true);
return gson.fromJson(jsonReader, type);
// return gson.fromJson(reader, type);
} finally {
closeQuietly(reader);
}
}

static void closeQuietly(Closeable closeable) {
if (closeable == null) return;
try {
closeable.close();
} catch (IOException ignored) {
}
}
}


3: 解析工厂

package com.retrofit.test.retrofit;

import com.google.gson.Gson;
import com.squareup.okhttp.RequestBody;
import com.squareup.okhttp.ResponseBody;

import java.lang.annotation.Annotation;
import java.lang.reflect.Type;

import retrofit.Converter;

/**
* ClassName MyGsonConverter
* Description
* Company
* author  youxuan  E-mail:xuanyouwu@163.com
* date createTime:2015/12/24 12:39
* version
*/
public class MyGsonConverter extends Converter.Factory {
public static MyGsonConverter create() {
return create(new Gson());
}

public static MyGsonConverter create(Gson gson) {
return new MyGsonConverter(gson);
}

private final Gson gson;

private MyGsonConverter(Gson gson) {
if (gson == null) throw new NullPointerException("gson == null");
this.gson = gson;
}

@Override
public Converter<ResponseBody, ?> fromResponseBody(Type type, Annotation[] annotations) {
return new GsonResponseBodyConverter<>(gson, type);
}

@Override public Converter<?, RequestBody> toRequestBody(Type type, Annotation[] annotations) {
return new GsonRequestBodyConverter<>(gson, type);
}
}


4:使用方式

Retrofit retrofit = new Retrofit.Builder()
.baseUrl(Constants.BASE_URL)
//.addConverterFactory(GsonConverterFactory.create())
.addConverterFactory(MyGsonConverter.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: