将单个 string/date 从 JsonObject 反序列化为 java 中的字符串

Deserialize single string/date from JsonObject to string in java

我有一个序列化的 json-日期。我想知道我是否可以像在 c# 中那样使用 json-date 反序列化单个字符串。但是在 java 中如何做到这一点?

这是 C# 代码:

DateTime dateTime = JsonConvert.DeserializeObject<DateTime>(string);

希望有人能提供帮助,我不需要创建一个整体 class 来做到这一点。

编辑: 这是字符串:“/Date(1630050818893+0300)/”

由于您正在尝试反序列化旧的 .NET 文本日期格式,因此您必须为 Date 类型设置 GSON JsonDeserializer

您可以实现一种匹配并从 String 日期中提取 timestamp 值,如下所示:

import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;

import java.lang.reflect.Type;
import java.util.Date;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class DateDeserializer implements JsonDeserializer<Date> {

    private static final Pattern DATE_PATTERN = Pattern.compile("/Date\((-?\d+).*\)/");

    @Override
    public Date deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext)
            throws JsonParseException {
        final Matcher matcher = DATE_PATTERN.matcher(jsonElement.getAsString());
        if (matcher.matches()) {
            final String timestamp = matcher.group(1);
            return new Date(Long.parseLong(timestamp));
        } else {
            throw new IllegalArgumentException(jsonElement.getAsString() + " does not match /Date(timestamp)/ pattern");
        }
    }
}

然后您可以将自定义 DateDeserializer 注册为您的 java.util.Date 类型反序列化器(假定您在 POJO 类型中使用此类型):

Gson gson = new GsonBuilder()
        .registerTypeAdapter(Date.class, new DateDeserializer())
        .create();
ObjectWithDate objectWithDate = gson.fromJson(json, ObjectWithDate.class);

其中 ObjectWithDate 是包含 java.util.Date 字段的模板对象:

public class ObjectWithDate {

    private final Date date;

    public ObjectWithDate(Date date) {
        this.date = date;
    }

    public Date getDate() {
        return date;
    }

    @Override
    public String toString() {
        return "ObjectWithDate{" +
                "date=" + date +
                '}';
    }
}