【问题标题】:How to make JSON annotation of Moshi case insensitive in Android如何在Android中使Moshi的JSON注释不区分大小写
【发布时间】:2018-10-16 11:17:44
【问题描述】:

有时我的后端返回电子邮件,有时它返回电子邮件。我希望第一个字符不区分大小写。这可能吗?

public class GetConversationListResponseBody {
    @Keep
    @Json(name = "email")
    private String email;    
}

【问题讨论】:

    标签: java android json moshi


    【解决方案1】:

    没有内置的通用方法可以做到这一点。

    如果您在单一情况下需要这个,自定义适配器是微不足道的。

    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");
    }
    

    【讨论】:

    • 那么 json.email 是如何被解析出来的呢?这是从哪里来的?
    【解决方案2】:

    这是Zac Sweers对此github issue的回答:

    JSON 键区分大小写。 email 和 Email 是两个不同的属性,应该这样对待,因为如果两者都存在于 JSON blob 中,则无法协调。如果 Moshi 不区分大小写,这将是一个错误,所以它绝对不是我们要添加的“功能”。

    【讨论】:

      猜你喜欢
      • 2014-04-25
      • 1970-01-01
      • 1970-01-01
      • 2011-10-14
      • 1970-01-01
      • 2020-04-08
      • 2020-05-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多