【问题标题】:Using Retrofit 2 but, have Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $使用 Retrofit 2,但预期 BEGIN_OBJECT 但在第 1 行第 1 列路径 $
【发布时间】:2019-12-17 17:55:12
【问题描述】:

我让request 使用 Retrofit 2 从 Flickr 获取照片。

我创建了一个类来解析它:

    public class FlickrResult {

    @SerializedName("photos")
    @Expose
    private FlickrPhotos photos;

    @SerializedName("stat")
    @Expose
    private String stat;

    public FlickrPhotos getPhotos() {
        return photos;
    }


    public class FlickrPhotos {

        @SerializedName("page")
        @Expose
        private int page;

        @SerializedName("pages")
        @Expose
        private String pages;

        @SerializedName("perpage")
        @Expose
        private int perpage;

        @SerializedName("total")
        @Expose
        private String total;

        @SerializedName("photo")
        @Expose
        private ArrayList<FlickrPhoto> photo;

        public ArrayList<FlickrPhoto> getPhoto() {
            return photo;
        }


        public class FlickrPhoto {

            @SerializedName("id")
            @Expose
            private String id;

            @SerializedName("owner")
            @Expose
            private String owner;

            @SerializedName("secret")
            @Expose
            private String secret;

            @SerializedName("server")
            @Expose
            private String server;

            @SerializedName("farm")
            @Expose
            private int farm;

            @SerializedName("title")
            @Expose
            private String title;

            @SerializedName("ispublic")
            @Expose
            private int ispublic;

            @SerializedName("isfriend")
            @Expose
            private int isfriend;

            @SerializedName("isfamily")
            @Expose
            private int isfamily;

            public String getTitle() {
                return title;
            }
        }

    }

  }

我的构建请求是:

 static {
        gson = new GsonBuilder()
                .setLenient()
                .create();
    }



 @NonNull
    private static Retrofit buildRetrofit() {
        Log.i(TAG, "onBuildRetrofitApiFactory");
        return new Retrofit.Builder()
                .baseUrl("https://api.flickr.com/services/")
                .client(getClient())
                .addConverterFactory(GsonConverterFactory.create(gson))
                .build();
    }

改造界面

@GET("rest")  
        Call<FlickrResult> getPhotos(@Query("method") String method,
                                     @Query("api_key") String key,
                                     @Query("format") String format,
                                     @Query ("nojsoncallbac") String nojsoncallbac
                                                    );

我负责的是成功,但是解析有问题。有例外:

java.lang.IllegalStateException: 应为 BEGIN_OBJECT,但在第 1 行第 1 列路径 $

请大家帮忙,我需要你的帮助!

【问题讨论】:

  • 闪烁的api响应是什么?如果响应结构因响应代码而异,那么您可能会遇到问题。你的改造界面是什么?
  • @Robert Estivill 不,我有相同的回应,如api.flickr.com/services/rest/…
  • 你的改造界面是什么?
  • @GET("rest") 调用 getPhotos(@Query("method") 字符串方法,@Query("api_key") 字符串键,@Query("format") 字符串格式, @Query ("nojsoncallbac") 字符串 nojsoncallbac );
  • 可能不相关,但 FlickrPhotos.pages 和 FlickrPhotos.total 都是整数而不是字符串

标签: java android json retrofit2


【解决方案1】:

你的改造界面是错误的。

参数“nojsoncallbac”不正确,应该是“nojsoncallback”。

这个不正确的参数会导致 API 在响应中返回不同的格式

jsonFlickrApi({
  "photos": {
  "page": 1,
  "pages": 10,
  "perpage": 100,
  "total": 1000,
  "photo": [
     ...
   ]
  }
 })

【讨论】:

    【解决方案2】:

    Gson 期望您的 JSON 字符串以对象左大括号开头

    {
    

    但是您传递给它的字符串可能以开放引号开头

    ""
    

    【讨论】:

      猜你喜欢
      • 2016-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-25
      • 2020-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多