当前位置: 首页 > 知识库问答 >
问题:

改装和Gson异常

齐兴运
2023-03-14

我想打一个改装电话,我得到了马尔福梅杰松例外。

这是我的电话:

String idFoto = "1ead0a1f-bbc4-46bd-901c-7988c0e6c68b";
Retrofit retrofit = new Retrofit.Builder()
     .baseUrl(Global.URL_BASE)
     .addConverterFactory(GsonConverterFactory.create())
     .build();
FotosAPI service = retrofit.create(FotosAPI.class);
Call<String> obtenerFotoCall = service.getFoto(Global.getToken(), idFoto);

这是我的界面:

public interface FotosAPI {
     @GET(Global.URL_FOTO + "{id}")
     Call<String> getFoto(@Header("Authorization") String token, @Path("id") String id);
}

调用队列进入onFailure方法,错误为"com.google.gson.stream.MalformedJsonExc0019:使用JsonReader.setLenient(true)在第1行第2列path$接受格式错误的JSON"。

我做了如下更改,以设置宽松:

Gson gson = new GsonBuilder().setLenient().create();
Retrofit retrofit = new Retrofit.Builder()
     .baseUrl(Global.URL_BASE)
     .addConverterFactory(GsonConverterFactory.create(gson))
     .build();

然后,我有一个不同的错误:“com.google.gson.stream.MalformedJsonException:第1行第1列路径$处的预期值”

我认为错误可能是在idFoto字符串值的Gson转换中,但我不知道是什么错误。

谁能帮帮我吗?

谢谢你们!

共有2个答案

祁飞扬
2023-03-14

就像MD说的(非常感谢你,伙计!),解决方案是将GsonConverter更改为ToStringCorverterFactory。

这是我使用的类:

import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.Type;
import okhttp3.MediaType;
import okhttp3.RequestBody;
import okhttp3.ResponseBody;
import retrofit2.Converter;
import retrofit2.Retrofit;

public class ToStringConverterFactory extends Converter.Factory {
    private static final MediaType MEDIA_TYPE = MediaType.parse("text/plain");

    @Override
    public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
        if (String.class.equals(type)) {
            return new Converter<ResponseBody, String>() {
                @Override
                public String convert(ResponseBody value) throws IOException {
                    return value.string();
                }
            };
        }
        return null;
    }

    @Override
    public Converter<?, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations,
                                                          Annotation[] methodAnnotations, Retrofit retrofit) {

        if (String.class.equals(type)) {
            return new Converter<String, RequestBody>() {
                @Override
                public RequestBody convert(String value) throws IOException {
                    return RequestBody.create(MEDIA_TYPE, value);
                }
            };
        }
        return null;
    }
}

然后你只需要将改装生成器更改为:

Retrofit retrofit = new Retrofit.Builder()
                        .baseUrl(Global.URL_BASE)
                        .addConverterFactory(new ToStringConverterFactory())
                        .build();
子车凯泽
2023-03-14

请检查您从服务器获得的JSON,在我的情况下,我从服务器获得的JSON是无效的。

尝试从邮递员或其他工具检查您的JSON。

 类似资料:
  • 在主要活动中 我得到java.lang.IllegalStateException:应该是BEGIN_OBJECT,但在第1行第2列路径$处是BEGIN_ARRAY。 我尝试更改为,但得到java.lang.IllegalStateException:应为字符串,但在第19行第17列路径$[0].Company处为BEGIN_OBJECT

  • 我想使用此服务:http://fast-gorge.herokuapp.com/contacts我设置Retrofit解析如下: 其中,我的日期格式为: 然而,当我运行该应用程序时,我进入了failure(reformerror error)方法,并显示消息:reformation。改装错误:com。谷歌。格森。JsonSyntaxException:2014-07-31T07:49:23.000

  • 但是,如果web服务器没有回复任何东西(成功登录),那么通过改型,我会得到一个异常,因为是空的,web服务器回复的是一个简单的空字符串消息,而不是字符串数组。如果我将更改为,它就可以工作,但我不能,因为如果登录失败,它必须是一个字符串数组。

  • 我试图在Reformation/gson中解析下面的json响应,特别是这个json 我尝试使用Map 但我总是得到回应。正文()为空。我是否需要创建实现JsonDeserializer的自定义json去序列化器并传递给gson生成器?

  • 我不熟悉GSON和改装,这是我的输出模型(仅供参考结构), 这是我的输出 这是我的改装代码 应为BEGIN_对象,但为BEGIN_数组“ 我尝试过用List替换RootObject

  • 我有以下类层次结构 改装日志: 但是当我在请求参数中发布事件实例时,只有抽象类被序列化。 改型Java接口: 我还注意到,在第二种情况下,字段序列化名称是,但它应该是!这使我认为改型对使用的与对参数使用的不同... 分级依赖关系 REST客户端