Retrofit을 사용하여 중첩 된 JSON을 역 직렬화 할 수 없음 (Android)

Dudeck

다음과 같이 "_embedded"태그로 JSON을 래핑했습니다.

{
  "_embedded" : {
    "events" : [ { ... }]}

인터페이스와 함께 개조를 사용하고 있습니다.

public interface IEventRest {
    @GET("/events/search/findByPlaceId")
    Observable<List<Event>> getEventList(@Query("placeId")String placeId);
}

그리고 이것은 내 REST 클래스입니다.

public class EventRest implements IEventRest {
Gson gson = new GsonBuilder()
        .registerTypeAdapter(Event[].class, new MyDeserializer())
        .create();

private Retrofit getRetrofitClient() {
    final HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);

    final OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();

    return new Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create(gson))
            .baseUrl(UrlUtils.URL)
            .client(client)
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .build();
}

@Override
public Observable<List<Event>> getEventList(String placeId) {
    final IEventRest placeRest = getRetrofitClient().create(IEventRest.class);

    return placeRest.getEventList(placeId)
            .subscribeOn(Schedulers.io())
            .observeOn(Schedulers.newThread());
}

private class MyDeserializer implements JsonDeserializer<List<Event>> {
    @Override
    public List<Event> deserialize(JsonElement je, Type type, JsonDeserializationContext jdc)
            throws JsonParseException {
        JsonElement content = je.getAsJsonObject().get("_embedded");

        Type collectionType = new TypeToken<Collection<Event>>(){}.getType();
        return new Gson().fromJson(content, collectionType);

    }
}
}

그러나 placeRest.getEventList (placeId)를 호출하면 예외가 발생합니다.

java.lang.IllegalStateException: Exception thrown on Scheduler.Worker thread. Add `onError` handling.
  at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:57)
  at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423)
  at java.util.concurrent.FutureTask.run(FutureTask.java:237)
  at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
  at java.lang.Thread.run(Thread.java:818)
Caused by: rx.exceptions.OnErrorNotImplementedException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $
  at rx.internal.util.InternalObservableUtils$ErrorNotImplementedAction.call(InternalObservableUtils.java:386)
  at rx.internal.util.InternalObservableUtils$ErrorNotImplementedAction.call(InternalObservableUtils.java:383)
  at rx.internal.util.ActionSubscriber.onError(ActionSubscriber.java:44)
  at rx.observers.SafeSubscriber._onError(SafeSubscriber.java:152)
  at rx.observers.SafeSubscriber.onError(SafeSubscriber.java:115)
  at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.checkTerminated(OperatorObserveOn.java:276)
  at rx.internal.operators.OperatorObserveOn$ObserveOnSubscriber.call(OperatorObserveOn.java:219)
  at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
  at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423) 
  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
  at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:269) 
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
  at java.lang.Thread.run(Thread.java:818) 
Caused by: java.lang.IllegalStateException: Expected BEGIN_ARRAY but was BEGIN_OBJECT at line 1 column 2 path $
  at com.google.gson.stream.JsonReader.beginArray(JsonReader.java:351)
  at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:80)
  at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.read(CollectionTypeAdapterFactory.java:61)
  at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:37)
  at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:25)
  at retrofit2.ServiceMethod.toResponse(ServiceMethod.java:117)
  at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:211)
  at retrofit2.OkHttpCall.execute(OkHttpCall.java:174)
  at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$RequestArbiter.request(RxJavaCallAdapterFactory.java:171)
  at rx.internal.operators.OperatorSubscribeOn$1$1$1.request(OperatorSubscribeOn.java:80)
  at rx.Subscriber.setProducer(Subscriber.java:211)
  at rx.internal.operators.OperatorSubscribeOn$1$1.setProducer(OperatorSubscribeOn.java:76)
  at rx.Subscriber.setProducer(Subscriber.java:205)
  at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:152)
  at retrofit2.adapter.rxjava.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:138)
  at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
  at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
  at rx.Observable.unsafeSubscribe(Observable.java:9860)
  at rx.internal.operators.OperatorSubscribeOn$1.call(OperatorSubscribeOn.java:94)
  at rx.internal.schedulers.CachedThreadScheduler$EventLoopWorker$1.call(CachedThreadScheduler.java:221)  

무엇이 잘못되었는지 알아 내도록 도와 주시겠습니까? 미리 감사드립니다.

OneCricketeer

"_embedded"태그로 래핑 된 JSON이 있습니다.

그리고 그것이 바로 문제입니다. Gson은 데이터가 래핑 된 것을 알지 못합니다. 보이는 문자열에서 객체라는 것만 신경을 씁니다.

여기 에서 미리보기를 가져옵니다. 총 3 개의 개체가 표시됩니다.

Event.java

(JSON이 어떻게 생겼는지 생략했기 때문에 생성되지 않았습니다)

Embedded.java

import java.util.ArrayList;
import java.util.List;
import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Embedded {

    @SerializedName("events")
    @Expose
    private List<Event> events = new ArrayList<Event>();

    public Embedded() {
    }

    public Embedded(List<Event> events) {
        this.events = events;
    }

    public List<Event> getEvents() {
        return events;
    }

    public void setEvents(List<Event> events) {
        this.events = events;
    }

}

Response.java

import com.google.gson.annotations.Expose;
import com.google.gson.annotations.SerializedName;

public class Response {

    @SerializedName("_embedded")
    @Expose
    private Embedded embedded;

    public Response() {
    }

    public Response(Embedded embedded) {
        this.embedded = embedded;
    }

    public Embedded getEmbedded() {
        return embedded;
    }


    public void setEmbedded(Embedded embedded) {
        this.embedded = embedded;
    }

}

그리고, 이제, 약 개조 염려는 Call<Response>, 어떤 당신은 전화 후 수.getEmbedded().getEvents()


또는 MyDeserializer기존 코드의 문제인 것 같기 때문에 더 많은 작업을 할 수 있습니다.

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

복잡하고 중첩 된 JSON을 어떻게 역 직렬화 할 수 있습니까?

분류에서Dev

protobuf-net을 사용하여 C #에서 역 직렬화 할 수 없음

분류에서Dev

Json.NET을 사용하여 Json String에서 중첩 된 DataSet 역 직렬화

분류에서Dev

현재 JSON 배열 (예 : [1,2,3])을 복잡하고 중첩 된 개체가있는 유형으로 역 직렬화 할 수 없습니다.

분류에서Dev

System.Text.Json을 사용하여 DateTime, Guid 또는 Enum을 역 직렬화 할 수 없음

분류에서Dev

Android : Retrofit 및 Jackson을 사용하여 동적 JSON 역 직렬화

분류에서Dev

SimpleXML을 사용하여 SOAP 응답을 역 직렬화 할 수 없습니까?

분류에서Dev

현재 JSON 개체를 역 직렬화 할 수 없습니다. 그룹 열을 사용하여 현재 JSON 개체를 역 직렬화 할 수 없습니다.

분류에서Dev

json.dumps ()를 사용하여 중첩 된 Python 객체를 직렬화 할 수 없습니다.

분류에서Dev

중첩 된 JSON을 중첩 된 Dictionary <string, object>로 역 직렬화

분류에서Dev

스프레이 json 중첩 클래스를 역 직렬화 할 수 없음

분류에서Dev

JSON에서 사전을 역 직렬화 할 수 없습니다.

분류에서Dev

UWP 앱에서 JSON을 역 직렬화 할 수 없음

분류에서Dev

System.Text.Json을 사용하여 배열 json 개체의 중첩 된 배열을 역 직렬화

분류에서Dev

Symfony 4에서 중첩 된 DateTime 객체를 사용하여 json을 엔티티로 역 직렬화

분류에서Dev

VB.net을 사용하여 Json이 Youtube 데이터를 역 직렬화 할 수 없습니다.

분류에서Dev

SwiftyJSON을 사용하여 역 직렬화 할 변수로 JSON 응답 저장

분류에서Dev

중첩 된 json 문자열을 역 직렬화하면 null 값이됩니다.

분류에서Dev

C #에서 Newtonsoft를 사용하여 Json에서 중첩 된 개체의 효율적인 수동 역 직렬화

분류에서Dev

직렬화 후 저지로 json을 역 직렬화 할 수 없습니까?

분류에서Dev

Json을 중첩 된 pojo로 역 직렬화

분류에서Dev

Android 용 RetroFit을 사용하여 중첩 된 JSON 구문 분석

분류에서Dev

JSON 목록을 C #의 개체 목록으로 역 직렬화 할 수 없음

분류에서Dev

C #에서 Newtonsoft를 사용하여 중첩 된 JSON 개체의 역 직렬화

분류에서Dev

JsonConvert.DeserializeObject를 사용하여 중첩 된 Json 문자열 역 직렬화

분류에서Dev

CouchDB에서 Json을 역 직렬화 할 수 없습니다.

분류에서Dev

JSON을 역 직렬화 할 수 없습니다.

분류에서Dev

JSON 응답을 역 직렬화 할 수 없습니다.

분류에서Dev

json을 제대로 역 직렬화 할 수 없습니다.

Related 관련 기사

  1. 1

    복잡하고 중첩 된 JSON을 어떻게 역 직렬화 할 수 있습니까?

  2. 2

    protobuf-net을 사용하여 C #에서 역 직렬화 할 수 없음

  3. 3

    Json.NET을 사용하여 Json String에서 중첩 된 DataSet 역 직렬화

  4. 4

    현재 JSON 배열 (예 : [1,2,3])을 복잡하고 중첩 된 개체가있는 유형으로 역 직렬화 할 수 없습니다.

  5. 5

    System.Text.Json을 사용하여 DateTime, Guid 또는 Enum을 역 직렬화 할 수 없음

  6. 6

    Android : Retrofit 및 Jackson을 사용하여 동적 JSON 역 직렬화

  7. 7

    SimpleXML을 사용하여 SOAP 응답을 역 직렬화 할 수 없습니까?

  8. 8

    현재 JSON 개체를 역 직렬화 할 수 없습니다. 그룹 열을 사용하여 현재 JSON 개체를 역 직렬화 할 수 없습니다.

  9. 9

    json.dumps ()를 사용하여 중첩 된 Python 객체를 직렬화 할 수 없습니다.

  10. 10

    중첩 된 JSON을 중첩 된 Dictionary <string, object>로 역 직렬화

  11. 11

    스프레이 json 중첩 클래스를 역 직렬화 할 수 없음

  12. 12

    JSON에서 사전을 역 직렬화 할 수 없습니다.

  13. 13

    UWP 앱에서 JSON을 역 직렬화 할 수 없음

  14. 14

    System.Text.Json을 사용하여 배열 json 개체의 중첩 된 배열을 역 직렬화

  15. 15

    Symfony 4에서 중첩 된 DateTime 객체를 사용하여 json을 엔티티로 역 직렬화

  16. 16

    VB.net을 사용하여 Json이 Youtube 데이터를 역 직렬화 할 수 없습니다.

  17. 17

    SwiftyJSON을 사용하여 역 직렬화 할 변수로 JSON 응답 저장

  18. 18

    중첩 된 json 문자열을 역 직렬화하면 null 값이됩니다.

  19. 19

    C #에서 Newtonsoft를 사용하여 Json에서 중첩 된 개체의 효율적인 수동 역 직렬화

  20. 20

    직렬화 후 저지로 json을 역 직렬화 할 수 없습니까?

  21. 21

    Json을 중첩 된 pojo로 역 직렬화

  22. 22

    Android 용 RetroFit을 사용하여 중첩 된 JSON 구문 분석

  23. 23

    JSON 목록을 C #의 개체 목록으로 역 직렬화 할 수 없음

  24. 24

    C #에서 Newtonsoft를 사용하여 중첩 된 JSON 개체의 역 직렬화

  25. 25

    JsonConvert.DeserializeObject를 사용하여 중첩 된 Json 문자열 역 직렬화

  26. 26

    CouchDB에서 Json을 역 직렬화 할 수 없습니다.

  27. 27

    JSON을 역 직렬화 할 수 없습니다.

  28. 28

    JSON 응답을 역 직렬화 할 수 없습니다.

  29. 29

    json을 제대로 역 직렬화 할 수 없습니다.

뜨겁다태그

보관