我需要将json发送到我的Web服务,json是:
{ "Sala": { "usuario": "%@", "adversario": "%@", "atualizacao": "%@", "device": "%@", "device_tipo": "ios" } }
。我正在尝试使用Retrofit API 1.8。当我尝试发送帖子时引发异常。
例外:
com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 7 path $
我正在尝试
public class ChatObject { private String usuario; private String adversario; private String atualizacao; private String email; private String device; private String device_tipo;
改造接口
@POST("/WsChat/interacao.json") public void onReceiveMessage(@Body ChatObject obj, Callback<JsonElement> response);
机具
public void receiveMessage(){ ///{\"Sala\":{\"usuario\":\"%@\",\"adversario\":\"%@\",\"atualizacao\":\"%@\",\"device\":\"%@\",\"device_tipo\":\"ios\"}} ChatObject chatObject = new ChatObject(BatalhaConfigs.USUARIO_EMAIL, BatalhaConfigs.ADVERSARIO_EMAIL, new Date().toString(), BatalhaConfigs.USUARIO_EMAIL, AndroidReturnId.getAndroidId(), "android"); RestAdapter adapter = new RestAdapter.Builder() .setLogLevel(RestAdapter.LogLevel.FULL) .setRequestInterceptor(new CustomRequestInterceptor()) .setEndpoint(END_POINT) .build(); ChatListener listener = adapter.create(ChatListener.class); listener.onReceiveMessage(chatObject, new Callback<JsonElement>() { @Override public void success(JsonElement jsonElement, retrofit.client.Response response) { Log.i("JSON ELEMENT->", jsonElement.toString()); } @Override public void failure(RetrofitError error) { Log.i("FALHOU->", error.getLocalizedMessage()); } }); }
com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true)通常是在某些字符格式不正确的JSON时抛出。异常消息本身建议使反序列化更加容忍。
com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true)
但是我建议您修复JSON并从不需要的字符中修剪掉它。
您应该扩展GsonConverter 和覆盖fromBody()以Gson从宽容中读取JsonReader。然后将其设置为您的RestAdapter。JsonReader如果没有抛出异常,这将尝试使用宽容反序列化,然后将其关闭。
GsonConverter
fromBody()
Gson
JsonReader
RestAdapter
public class LenientGsonConverter extends GsonConverter { private Gson mGson; public LenientGsonConverter(Gson gson) { super(gson); mGson = gson; } public LenientGsonConverter(Gson gson, String charset) { super(gson, charset); mGson = gson; } @Override public Object fromBody(TypedInput body, Type type) throws ConversionException { boolean willCloseStream = false; // try to close the stream, if there is no exception thrown using tolerant JsonReader try { JsonReader jsonReader = new JsonReader(new InputStreamReader(body.in())); jsonReader.setLenient(true); Object o = mGson.fromJson(jsonReader,type); willCloseStream = true; return o; } catch (IOException e) { e.printStackTrace(); }finally { if(willCloseStream) { closeStream(body); } } return super.fromBody(body, type); } private void closeStream(TypedInput body){ try { InputStream in = body.in(); in.close(); } catch (IOException e) { e.printStackTrace(); } } }
}