MalformedJsonException with Retrofit API?

后端 未结 7 792
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-01 14:18

I need send a json to my webservice, json is:

{
    \"Sala\": {
        \"usuario\": \"%@\",
        \"adversario\": \"%@\",
        \"atualizacao\": \"%@\"         


        
相关标签:
7条回答
  • 2020-12-01 15:03

    if you are using PHP as API please check whether it echoes only JSON encoded objects otherwise it will throw this type of exception

    0 讨论(0)
  • 2020-12-01 15:10
     RestAdapter adapterRfqPost = new RestAdapter.Builder()
                                        .setEndpoint(Constants.ENDPOINT)
                                                `enter code here`.setConverter(new ConstantsMethods.StringConverter())
                                        .build();
    

    public static class StringConverter implements Converter {
            @Override
            public Object fromBody(TypedInput typedInput, Type type) throws ConversionException {
                String text = null;
                try {
                    text = fromStream(typedInput.in());
                } catch (IOException ignored) {/*NOP*/ }
                return text;
            }
    
            @Override
            public TypedOutput toBody(Object o) {
                return null;
            }
    
            public static String fromStream(InputStream in) throws IOException {
                BufferedReader reader = new BufferedReader(new InputStreamReader(in));
                StringBuilder out = new StringBuilder();
                String newLine = System.getProperty("line.separator");
                String line;
                while ((line = reader.readLine()) != null) {
                    out.append(line);
                    out.append(newLine);
                }
                return out.toString();
            }
        }
    
    0 讨论(0)
  • 2020-12-01 15:11

    Below code worked for me

    Gson gson = new GsonBuilder()
            .setLenient()
            .create();
    
    final RestAdapter restAdapter = new RestAdapter.Builder()
            .setEndpoint(endPoint)
            .setConverter(new GsonConverter(gson))
            .build();
    

    For using ".setLenient()", need to add below line into app's gradle file.

    implementation 'com.google.code.gson:gson:2.7'

    0 讨论(0)
  • 2020-12-01 15:15

    com.google.gson.JsonSyntaxException: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) is usually thrown when there is some character(s) that malforms the JSON. Exception message itself suggest to make the deserialization more tolerant.

    But I suggest you to fix your JSON and trim it from unwanted characters.

    You should extend GsonConverter and override fromBody() to make Gson read from the tolerant JsonReader. Then just set it to your RestAdapter. This will attempt to use tolerant JsonReader to deserialize and then close it, if not exception is thrown.

    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();
            }
        }
    }
    

    }

    0 讨论(0)
  • 2020-12-01 15:16

    I struggled around a day getting this error and doing what the "correct answer" of this page said so, but after all I figured out my problem, that was assigning the response from an array that was "int" (also my model class was int) to an textView which of course required me to convert it to string the int value. I didn't even required to do the solution of @Nikola Despotoski at all in my case.

    0 讨论(0)
  • 2020-12-01 15:16

    You should help this code :

    RestAdapter restAdapter = new RestAdapter.Builder()
                     .setEndpoint("http://192.168.10.115/test.php")
                     .setConverter(new GsonConverter(new Gson()))
                     .build();
    

    Put jar file :

    [gson-2.2.2.jar][1]
    
    0 讨论(0)
提交回复
热议问题