title: Custom converter to subclass with Moshi
body: <p>I have a User class. And two subclasses. Parent and Child.
  I get json from my server with {"user":"..."} and need to convert it to parent or to child depending on user.type</p>
  
  <p>As I understand I need to add custom converter this way:</p>
  
  <pre><code>        Moshi moshi = new Moshi.Builder()
              .add(new UserAdapter())
              .build();
  </code></pre>
  
  <p>Here's my implementation of UserAdapter. I know it's dummy, but it's not working even this way:</p>
  
  <pre><code>public class UserAdapter {
  
  @FromJson
  User fromJson(String userJson) {
      Moshi moshi = new Moshi.Builder().build();
      try {
          JSONObject jsonObject = new JSONObject(userJson);
          String accountType = jsonObject.getString("type");
  
          switch (accountType) {
              case "Child":
                  JsonAdapter&lt;Child&gt; childJsonAdapter = moshi.adapter(Child.class);
                  return childJsonAdapter.fromJson(userJson);
              case "Parent":
                  JsonAdapter&lt;Parent&gt; parentJsonAdapter = moshi.adapter(Parent.class);
                  return parentJsonAdapter.fromJson(userJson);
  
          }
      } catch (JSONException | IOException e) {
          e.printStackTrace();
      }
  
      return null;
  }
  
  @ToJson
  String toJson(User user) {
      Moshi moshi = new Moshi.Builder().build();
      JsonAdapter&lt;User&gt; jsonAdapter = moshi.adapter(User.class);
      String toJson = jsonAdapter.toJson(user);
      return toJson;
  }
  </code></pre>
  
  <p>First of all I get following exception with this code.</p>
  
  <pre><code>com.squareup.moshi.JsonDataException: Expected a string but was BEGIN_OBJECT at path $.user
  </code></pre>
  
  <p>And second, I believe there's a better way to do it. Please advice.</p>
  
  <p>Upd. here's stacktrace for the error:</p>
  
  <pre><code> com.squareup.moshi.JsonDataException: Expected a name but was BEGIN_OBJECT at path $.user
   at com.squareup.moshi.JsonReader.nextName(JsonReader.java:782)
   at com.squareup.moshi.ClassJsonAdapter.fromJson(ClassJsonAdapter.java:141)
   at com.squareup.moshi.JsonAdapter$1.fromJson(JsonAdapter.java:68)
   at com.squareup.moshi.JsonAdapter.fromJson(JsonAdapter.java:33)
   at retrofit.MoshiResponseBodyConverter.convert(MoshiResponseBodyConverter.java:33)
   at retrofit.MoshiResponseBodyConverter.convert(MoshiResponseBodyConverter.java:23)
   at retrofit.OkHttpCall.parseResponse(OkHttpCall.java:148)
   at retrofit.OkHttpCall.execute(OkHttpCall.java:116)
   at retrofit.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:111)
   at retrofit.RxJavaCallAdapterFactory$CallOnSubscribe.call(RxJavaCallAdapterFactory.java:88)
   at rx.Observable$2.call(Observable.java:162)
   at rx.Observable$2.call(Observable.java:154)
   at rx.Observable$2.call(Observable.java:162)
   at rx.Observable$2.call(Observable.java:154)
   at rx.Observable.unsafeSubscribe(Observable.java:7710)
   at rx.internal.operators.OperatorSubscribeOn$1$1.call(OperatorSubscribeOn.java:62)
   at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
   at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:422)
   at java.util.concurrent.FutureTask.run(FutureTask.java:237)
   at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152)
   at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
   at java.lang.Thread.run(Thread.java:818)
  </code></pre>