fastjson Kotlin数据类嵌套反序列化问题

nzrxty8p  于 2021-11-27  发布在  Java
关注(0)|答案(1)|浏览(314)

如下代码:

data class Outer(val name: String, val inner: Inner?)
data class Inner(val name: String?)

fun main() {
    val oriObj = Outer("Cmd", Inner(null))
    println(oriObj) // Outer(name=Cmd, inner=Inner(name=null))

    val json = JSON.toJSONString(oriObj)
    println(json) // {"inner":{},"name":"Cmd"}

    val resObj = JSON.parseObject(json, Outer::class.javaObjectType)
    println(resObj) // Outer(name=Cmd, inner=null)
}

输出分别为:

Outer(name=Cmd, inner=Inner(name=null))
{"inner":{},"name":"Cmd"}
Outer(name=Cmd, inner=null)

可以看到序列化是没问题的,但反序列化时inner却为空,而不是期望的Inner(name = null)

但在类似的java代码中:

public class Tester {
    private static class Outer {
        public String name;
        public Inner inner;

        @Override
        public String toString() {
            return "Outer(name: " + name + ", inner: " + inner + ")";
        }
    }

    private static class Inner {
        public String name;

        @Override
        public String toString() {
            return "Inner(name: " + name + ")";
        }
    }

    public static void main(String[] args) {
        Outer oriObj = new Outer();
        oriObj.name = "Cmd";
        oriObj.inner = new Inner();
        System.out.println(oriObj); // Outer(name: Cmd, inner: Inner(name: null))

        String json = JSON.toJSONString(oriObj);
        System.out.println(json); // {"inner":{},"name":"Cmd"}

        Outer resObj = JSON.parseObject(json, Outer.class);
        System.out.println(resObj); // Outer(name: Cmd, inner: Inner(name: null))
    }
}

输出分别为:

Outer(name: Cmd, inner: Inner(name: null))
{"inner":{},"name":"Cmd"}
Outer(name: Cmd, inner: Inner(name: null))

可以看到java中的序列化与反序列化是没有问题且符合预期的

  • fastjson: 1.1.70.android
  • kotlin: 1.3.11
3vpjnl9f

3vpjnl9f1#

Seems, it resolved in 1.1.71.android. Kotlin version is 1.3.30.

data class A(val a: String, val b: B)
data class B(val b: Int)

fun fastJsonTest() {
    val b = B(12)
    val a = A("12", b)
    println(JSON.parseObject(JSON.toJSONString(a), A::class.javaObjectType))
}

相关问题