SalomonBrys / Kotson

Kotlin bindings for JSON manipulation via Gson
MIT License
709 stars 37 forks source link

Nested generic type in generic function #37

Open Zkffkah opened 6 years ago

Zkffkah commented 6 years ago

I have a json like this

    val JSON_LIST_STRING = """
{
  "code": "0",
  "msg": "Success",
  "subcode": "0",
  "data": [{
    "test": 10
  }
  ]
}
""".trimIndent()

model like this

    data class TestObject(val test: Int)

public class ApiResult<T> {
    private int code;
    private int subcode;
    private String msg;
    private T data;

    public int getCode() {
        return code;
    }

    public void setCode(int code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public boolean isOk() {
        return code == 0;
    }

    @Override
    public String toString() {
        return "ApiResult{" +
                "code='" + code + '\'' +
                ", msg='" + msg + '\'' +
                ", data=" + data +
                '}';
    }

    public int getSubcode() {
        return subcode;
    }

    public void setSubcode(int subcode) {
        this.subcode = subcode;
    }
}

test code like this

  @Test
    fun testFunListGson() {

        val result = data<List<TestObject>>()
        assertThat(result.data[0].test).isEqualTo(10)
    }

    @Test
    fun testDirectListGson() {

        val result = gson.fromJson<ApiResult<List<TestObject>>>(JSON_LIST_STRING)
        assertThat(result.data[0].test).isEqualTo(10)
    }

    fun <T> data(): ApiResult<T> {
        return gson.fromJson(JSON_LIST_STRING)
    }

Expect testFunListGson will pass, but it failed like this

java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.xxx.GsonTest$TestObject

It looks like it's not getting past the underneath generic type.