当前位置: 首页 > 知识库问答 >
问题:

为什么是谷歌Gson。toJson会丢失数据

冯元魁
2023-03-14

我有五门课:

评论Wound纸文档WoundDoc

Comment是文本的持有者。
是空的抽象类。
Wound纸扩展并存储一个String和一个ArrayList的评论
Document抽象类并存储的ArrayList

您可以在下面看到这些类:

注释类:

public class Comment {

    private final String text;

    public static class Builder {
        private final String text;

        public Builder(String text) {
            this.text = text;
        }

        public Comment build(){
            return new Comment(this);
        }

    }

    private Comment(Builder builder) {
        this.text = builder.text;
    }

    public String getText() {
        return text;
    }

}

论文课:

public abstract class Paper {

    protected Paper(ArrayList<Comment> commentList) {
    }

}

伤痕纸类:

public class WoundPaper extends Paper {

    private final String imageUri;
    private final ArrayList<Comment> commentList;

    public static class Builder {
        private final String imageUri;
        private final ArrayList<Comment> commentList;

        public Builder(String imageUri, ArrayList<Comment> commentList) {
            this.imageUri = imageUri;
            this.commentList = commentList;
        }

        public WoundPaper build() {
            return new WoundPaper(this);
        }

    }

    private WoundPaper(Builder builder) {
        super(builder.commentList);
        this.imageUri = builder.imageUri;
        this.commentList = builder.commentList;
    }

}

文档类:

public abstract class Document {
    private final ArrayList<? extends Paper> paperList;


    protected Document(ArrayList<? extends Paper> paperList) {
        this.paperList = paperList;
    }

}

WoundDoc类:

public class WoundDoc extends Document {

    public static class Builder {
        private final ArrayList<WoundPaper> paperList;

        public Builder(ArrayList<WoundPaper> paperList) {
            this.paperList = paperList;
        }

        public WoundDoc build() {
            return new WoundDoc(this);
        }

    }

    private WoundDoc(Builder builder) {
        super(builder.paperList);
    }

}

现在我必须创建一个WoundDoc的实例并通过Gson将其转换为JSON字符串。这是一个示例代码:

        Comment comment = new Comment.Builder("comment").build();
        ArrayList<Comment> commentList = new ArrayList<Comment>();
        commentList.add(comment);
        commentList.add(comment);

        WoundPaper woundPaper = new WoundPaper.Builder("some Uri", commentList).build();
        ArrayList<WoundPaper> woundPaperList = new ArrayList<WoundPaper>();
        woundPaperList.add(woundPaper);
        woundPaperList.add(woundPaper);

        WoundDoc woundDoc = new WoundDoc.Builder(woundPaperList).build();

        System.out.println("woundDoc to JSON >> " + gson.toJson(woundDoc));

但输出很奇怪:

WoundDoc到JSON

正如我之前显示的,WoundDoc存储WoundPaper的列表,每个WoundPaper存储注释的列表。但是为什么输出中没有注释


共有1个答案

韦鸣
2023-03-14

当gson将WoundDoc序列化时,它能告诉你的是,有一个列表,其中包含两个类型为某物的对象,它们扩展了纸张列表)

解决这个问题的一种方法是将类型从实现传递到抽象类,这样当gson检查它们时,它就可以看到它遇到的对象是哪个类的实例,并确定如何序列化它们。

更新文档以获取类型参数:

public abstract class Document<T extends Paper> {
    private final ArrayList<T> paperList;


    protected Document(ArrayList<T> paperList) {
        this.paperList = paperList;
    }
}

更新WoundDoc以将类型传递到文档:

public class WoundDoc extends Document<WoundPaper> {

如果您无法进行上述更改,另一种解决方法是为WoundDoc编写自定义序列化程序

就我个人而言,我会使用第一个解决方案和传递类型,因为我很懒,编写自定义序列化器更费力

编辑:对jackson小声喊叫,如果你试图序列化某个内容,但它无法解决如何执行,则会抛出异常。

 类似资料:
  • 使用Flume源syslogudp,我看到大约25%的数据丢失。 这是我的配置 a1.sources = r1 a1.sinks=k1 a1 .通道= c1 a1.sources.r1.type = syslogudp a1.sources.r1.bind = 172.24.1.78 a1.sources.r1.port = 65535 a1.sinks.k1.type=文件滚动 水槽。水槽。目录

  • 我编写了一个非常简单的Flink流媒体作业,它使用从Kafka获取数据。 这工作得很好,每当我在Kafka上将某些内容放入主题时,它都会被我的Flink作业接收并处理。现在我试图看看如果我的Flink作业由于某种原因不在线会发生什么。所以我关闭了flink作业并继续向Kafka发送消息。然后我再次开始我的Flink作业,并期望它会处理同时发送的消息。 然而,我得到了以下信息: 因此,它基本上忽略了

  • 如果我对海量数据存储和搜索能力都有一个用例,为什么我会选择Google Cloud Bigtable而不是Google Cloud Datastore? 我看到了一些关于“比较”Bigtable和Datastore的问题,但似乎归结为相同的非特定答案。 以下是我目前的知识和想法: 数据存储更昂贵。 在这个问题的背景下,让我们完全忘记定价。 Bigtable适用于大型数据集。 看来Datastore

  • 当我将Object转换为Json时,我遇到了大十进制精度丢失的问题。 假设我有Pojo类, 现在我将值设置为Pojo,然后转换为JSON 第一次测试-正确输出 第二次测试-输出错误(失去BigDecimal精度) 第三次测试-输出错误(失去BigDecimal精度) 令人惊讶的是,每当BigDecimal值的长度更大时,它也会截断小数点。json转换有什么问题。你能给我提供解决方案吗?

  • 使用window.open打开同源新tab,新页面localstorage中token丢失。