Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Moshi需要BEGIN_对象,但BEGIN_数组被忽略-自定义转换器_Java_Json_Retrofit2_Moshi - Fatal编程技术网

Java Moshi需要BEGIN_对象,但BEGIN_数组被忽略-自定义转换器

Java Moshi需要BEGIN_对象,但BEGIN_数组被忽略-自定义转换器,java,json,retrofit2,moshi,Java,Json,Retrofit2,Moshi,我使用Moshi作为转换器进行改装,但对于一个特定的请求,它不起作用,并引发异常: com.squareup.moshi.JsonDataException:应为BEGIN_对象,但在路径$处为BEGIN_数组。结果 我要解析的JSON: { "id": 423, "results": [ { "id": "53484dfec3a3684b930000bd", "iso_639_1": "en", "iso_3166_1": "US",

我使用Moshi作为转换器进行改装,但对于一个特定的请求,它不起作用,并引发异常:
com.squareup.moshi.JsonDataException:应为BEGIN_对象,但在路径$处为BEGIN_数组。结果

我要解析的JSON:

{
  "id": 423,
  "results": [
    {
      "id": "53484dfec3a3684b930000bd",
      "iso_639_1": "en",
      "iso_3166_1": "US",
      "key": "u_jE7-6Uv7E",
      "name": "Trailer",
      "site": "YouTube",
      "size": 360,
      "type": "Trailer"
    },
    {
      "id": "57e16bb0c3a36808bc000641",
      "iso_639_1": "en",
      "iso_3166_1": "US",
      "key": "BFwGqLa_oAo",
      "name": "Trailer",
      "site": "YouTube",
      "size": 1080,
      "type": "Trailer"
    }
  ]
}
模型类别:

public class VideosResponse {
    private int id;
    private List<Video> results;
    //+ getters & setters
}
public class Video {
    private String id;
    @Json(name = "iso_639_1")
    private String iso6391;
    @Json(name = "iso_3166_1")
    private String iso31661;
    private String key;
    private String name;
    private String site;
    private Integer size;
    private String type;
    //+getters & setters
}

我的自定义转换器实际上没有被调用,所以看起来Moshi无法将JSON转换为我的
VideosResponse
包装类。如果我将转换器更改为接受
映射
,它将转到那里,但不用于
视频响应
。当我将改装点更改为直接返回
VideosResponse
时,它也可以工作。是否可能与其他POJO类发生冲突(我有类似的类,但有不同对象的列表)

问题是适配器将被您想要的结果和VideosResponse中的内部列表使用。因此,适配器期望VideoResponse中包含一个VideoResponse格式的JSON blob,并在重新进入时找到真正的数组时失败

您可以限定其中一个列表以区分它们。 下面是一个限定结果列表的示例

@Retention(RUNTIME)
@JsonQualifier
public @interface Wrapped {
}

public class VideosJsonConverter {
  @Wrapped @FromJson
  public List<Video> fromJson(VideosResponse json) {
    return json.results;
  }

  @ToJson
  public VideosResponse toJson(@Wrapped List<Video> value) {
    throw new UnsupportedOperationException();
  }
}

@GET("3/movie/{id}/videos")
@Wrapped
Call<List<Video>> movieVideos(
  @Path("id") int id,
  @Query("api_key") String apiKey);
@保留(运行时)
@JsonQualifier
public@interface-Wrapped{
}
公共类视频转换器{
@包装@FromJson
来自json的公共列表(视频响应json){
返回json.results;
}
@ToJson
公共视频响应JSON(@Wrapped List value){
抛出新的UnsupportedOperationException();
}
}
@获取(“3/movie/{id}/videos”)
@包裹
电话录像(
@路径(“id”)内部id,
@查询(“api_键”)字符串(api键);

谢谢您的解释。我没有意识到这一点,因为我实际上不知道它在引擎盖下是如何工作的。
public class VideosJsonConverter {
    @FromJson
    public List<Video> fromJson(VideosResponse json) {
        return json.getResults();
    }
}
public Retrofit provideRetrofit(@Named("baseUrl") String basUrl) {
        Moshi moshi = new Moshi.Builder().add(new VideosJsonConverter()).build();
        return new Retrofit.Builder()
                .baseUrl(basUrl)
                .addConverterFactory(MoshiConverterFactory.create(moshi))
                .build();
    }
@Retention(RUNTIME)
@JsonQualifier
public @interface Wrapped {
}

public class VideosJsonConverter {
  @Wrapped @FromJson
  public List<Video> fromJson(VideosResponse json) {
    return json.results;
  }

  @ToJson
  public VideosResponse toJson(@Wrapped List<Video> value) {
    throw new UnsupportedOperationException();
  }
}

@GET("3/movie/{id}/videos")
@Wrapped
Call<List<Video>> movieVideos(
  @Path("id") int id,
  @Query("api_key") String apiKey);