Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Feature Request]Add an option that force primitive type to be non-nullable into Extensions Tab #234

Closed
Huskyyy opened this issue Aug 26, 2019 · 8 comments
Assignees
Labels
feature request L3 Difficulty level 3 (Maximum is 9)
Milestone

Comments

@Huskyyy
Copy link

Huskyyy commented Aug 26, 2019

举个例子,
{ picture: { "id" : 1, "url" : "" } }
用这个Json生成Kotlin data代码时,如果勾选了 nullable,生成的代码类似于

data class Picture(var id : Int? = null, var url : String? = null)

能不能识别出基本类型,也就是下面这样

data class Picture(var id : Int = 0, var url : String? = null)
@wuseal
Copy link
Owner

wuseal commented Aug 26, 2019

@Huskyyy 这个,还没太看明白你的需求,你是想要基本类型都给默认值并且不为null,然后String及其它类型给nullable类型及默认值为null?
另外: Kotiln中的所有类型都是对象类型,都是可以为null的

@Huskyyy
Copy link
Author

Huskyyy commented Aug 26, 2019

@Huskyyy 这个,还没太看明白你的需求,你是想要基本类型都给默认值并且不为null,然后String及其它类型给nullable类型及默认值为null?
另外: Kotiln中的所有类型都是对象类型,都是可以为null的

@wuseal
第一个问题,是的。
因为Json当中的基本类型是没有null值的。所以(抱歉这里我搞错了)
如果是var id : Int? = null这种,在Java代码中调用Kotlin时,需要加上判空的逻辑。
如果是var id : Int = 0,在Java代码里面就不需要判空了

@wuseal
Copy link
Owner

wuseal commented Aug 26, 2019

@Huskyyy 既然这样,不考虑试试这个?Init with default value (avoid null) with non-nullable,然后把Server返回的JSON里的null字段给过滤掉,这样的话,反序列化的Data Class对象就不会有NULL了,所有的字段都不需要判空了.

@Huskyyy
Copy link
Author

Huskyyy commented Aug 26, 2019

@wuseal
还是举个例子,
例如
{ "id" : null, "url" : null}

  1. 如果是Java代码的data对象
 public static class Picture {
    public long id;
    public String url = "";

    @Override
    public String toString() {
      return "Picture{" +
          "id=" + id +
          ", url='" + url + '\'' +
          '}';
    }
  }

Gson反序列化之后,生成的对象是
Picture{id=0, url=null}

  1. 如果是Kotlin的data对象
data class Picture(var id : Int = 0, var url : String = "")

Gson反序列化之后,生成的对象是
Pic(id=0, url=null)

  1. 如果是可以为空的Kotlin data对象
data class Picture(var id : Int? = 0, var url : String? = "")

Gson反序列化之后,生成的对象是
Pic(id=null, url=null)

这里有两个问题,
一个是,对比1和3,id作为基本类型,在Java里面是有默认值的,但是在Kotlin里,如果为可空,则有可能为空;
另一个是,假设给id和String都赋予默认值,则Gson反序列化之后,会把null值赋给id和String(如果可空的话),这个可能是Gson的bug

上述的第一个问题,实际上是Java代码和Kotlin代码对外暴露的调用方法会不一致,如果是1中的Java代码写的Picture,调用方不需要判断id是否为空;如果是3中的Kotlin代码写的data class,对于id反而需要加上判空的逻辑。
所以,对于基本类型,“可空”感觉是不太适合的

@wuseal
Copy link
Owner

wuseal commented Aug 26, 2019

@Huskyyy 我也测试了下, Gson确实是按你说的这种行为来的,但是其它的库不清楚,保守起见,可以增加一个选项:强制原始类型不为可空类型,可以放到Extenson模块里,不知道这样是否可以满足你的需求,若有问题,请直接回复.
另:

另一个是,假设给id和String都赋予默认值,则Gson反序列化之后,会把null值赋给id和String(如果可空的话),这个可能是Gson的bug

这个情况,只要把原始json里含有null的字段给过滤掉然后再去反序列化Picture对象,则不会把null设置进去:
比如把这个json反序列化:{}
则生成的对象是这样的: Picture(id=0, url=)

@Huskyyy
Copy link
Author

Huskyyy commented Aug 26, 2019

@wuseal

@Huskyyy 我也测试了下, Gson确实是按你说的这种行为来的,但是其它的库不清楚,保守起见,可以增加一个选项:强制原始类型不为可空类型,可以放到Extenson模块里,不知道这样是否可以满足你的需求,若有问题,请直接回复.

这个好赞!!!完全满足!!

这个情况,只要把原始json里含有null的字段给过滤掉然后再去反序列化Picture对象,则不会把null设置进去:
比如把这个json反序列化:{}
则生成的对象是这样的: Picture(id=0, url=)

关于这个,我才疏学浅。。。不知道在客户端怎么把null都给过滤掉。。。

@wuseal
Copy link
Owner

wuseal commented Aug 26, 2019

@Huskyyy 可以这样过滤:

val gson = Gson()
        
val demoJson = """{ "id" : null, "url" : null}"""

val expectJson = gson.toJson(gson.fromJson(demoJson, JsonElement::class.java))

println(expectJson)

输出结果为:

{}

@wuseal wuseal added this to the 3.5.0 milestone Aug 26, 2019
@wuseal wuseal added the L3 Difficulty level 3 (Maximum is 9) label Aug 26, 2019
@wuseal wuseal changed the title 高级选项中,勾选Type中的nullable,生成的代码是否可以优化 [Feature Request]Add an option that force primitive type to be non-nullable into Extensions Tab Aug 26, 2019
@xurui1995 xurui1995 self-assigned this Aug 26, 2019
@wuseal
Copy link
Owner

wuseal commented Sep 2, 2019

Fixed in 3.5.0-EAP

@wuseal wuseal closed this as completed Sep 2, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feature request L3 Difficulty level 3 (Maximum is 9)
Projects
None yet
Development

No branches or pull requests

3 participants