【问题标题】:How to solve Gson deserialization issue of polymorphism of java.lang objects如何解决java.lang对象多态的Gson反序列化问题
【发布时间】:2018-08-09 07:32:11
【问题描述】:

我使用 gson 进行反序列化。我的类有一个实例字段,它是一个 Object 类型,因为有时它可以用 String 或 Date 对象实例化。但是在反序列化时,我无法将它作为 Date 或 String 类型。 我知道有一个使用 RuntimeTypeAdapterFactory 的解决方案,但我不能使用它,因为我无法添加 RuntimeTypeAdapterFactory 解决方案 (https://futurestud.io/tutorials/how-to-deserialize-a-list-of-polymorphic-objects-with-gson),因为我无法将“类型”字段添加到 java.lang.String 或 java.util.Date。

有什么办法可以解决这个问题吗?

请查看此问题的示例代码

import java.lang.reflect.Type;
import java.text.SimpleDateFormat;

import java.util.Date;


import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import com.google.gson.reflect.TypeToken;

public class GsonSer {

    String name;
     Object dob;

    public GsonSer(String name, Date dob) {
        this.name = name;
        this.dob = dob;
    }

    static class JsonDateSerDeserializer implements JsonSerializer<Date>, JsonDeserializer<Date> {

        @Override
        public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext context) {

            return new JsonPrimitive(src.getTime());
        }

        @Override
        public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
                throws JsonParseException {
            Date parsed = new Date(json.getAsLong());
            return parsed;
        }

    }

    public static void main(String[] args) {
        GsonSer ser = new GsonSer("name", new Date());
     Type DATE_TYPE = new TypeToken<Date>() {
        }.getType();
        Gson gson = new GsonBuilder().registerTypeAdapter(DATE_TYPE, new JsonDateSerDeserializer())
                .create();
        String date = gson.toJson(ser);
        System.out.println("Original = " + ser.dob + "\n");
        GsonSer deser = gson.fromJson(date, GsonSer.class);
        System.out.println("after deser = " + deser.dob + "\n");

    }
}

//输出

原文 = 2018 年 8 月 9 日星期四 10:13:24 CEST

在deser = 1.533802404071E12之后

【问题讨论】:

  • 能否请您添加您的代码给出的输出?
  • 反序列化后dob显示为双精度值
  • 感谢您的快速回归!

标签: java gson


【解决方案1】:

一个明显的非回答:不要那样做。

这种“豆子”的意义在于充当“运输”工具。这意味着您应该真正确切地知道要运输什么。如果您需要处理多种类型,请将该部分作为 bean 类提供的 接口

意思:

  • 决定将 一个 类用作该字段的类型。为了灵活性,我会选择 String 。 Object 不是个好主意!
  • 提供 getter/setter,让您也可以设置/检索 Date 对象

换句话说:不要试图让 gson 为您解决歧义。

简单地避免 bean 的歧义,因此您可以使用 gson 而无需任何特殊设置。让 bean 包含一个字符串(理想情况下,您可以非正式地指定允许的格式),并使 bean 也接受代表日期/时间的 Date/Instant/Whatever 对象。

【讨论】:

    猜你喜欢
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2019-02-03
    • 2019-02-12
    • 2011-07-23
    相关资源
    最近更新 更多