4

Sometimes my back-end returns Email and sometimes it returns email. I want the first character to be case insensitive. Is this possible?

public class GetConversationListResponseBody {
    @Keep
    @Json(name = "email")
    private String email;    
}
Jim Clermonts
  • 1,694
  • 8
  • 39
  • 94

2 Answers2

0

There is no built-in generalized way to do this.

If you need this for single case, a custom adapter is trivial.

public static final class GetConversationListResponseBody {
  public final String email;

  GetConversationListResponseBody(String email) {
    this.email = email;
  }
}

static final class InternalGetConversationListResponseBody {
  String email;
  String EMAIL;

  static final Object ADAPTER = new Object() {
    @FromJson GetConversationListResponseBody fromJson(
        InternalGetConversationListResponseBody json) {
      String email = json.email != null ? json.email : json.EMAIL;
      return new GetConversationListResponseBody(email);
    }
  };
}

@Test public void getConversationListResponseBody() throws IOException {
  Moshi moshi = new Moshi.Builder()
      .add(InternalGetConversationListResponseBody.ADAPTER)
      .build();
  JsonAdapter<GetConversationListResponseBody> adapter = moshi.adapter(GetConversationListResponseBody.class);
  assertThat(adapter.fromJson("{\"email\":\"e@gmail.com\"}").email).isEqualTo("e@gmail.com");
  assertThat(adapter.fromJson("{\"EMAIL\":\"e@gmail.com\"}").email).isEqualTo("e@gmail.com");
}
Eric Cochran
  • 8,414
  • 5
  • 50
  • 91
0

Here is the answer of Zac Sweers on this github issue:

JSON keys are case-sensitive. email and Email are two different properties and should be treated as such, as there would be no way to reconcile if both were present in a JSON blob. It would be a bug if Moshi wasn't case-sensitive, so it's definitely not a "feature" that we would add.

Fartab
  • 4,725
  • 2
  • 26
  • 39