【问题标题】:Deserialize single string/date from JsonObject to string in java将JsonObject中的单个字符串/日期反序列化为java中的字符串
【发布时间】:2021-10-29 05:00:09
【问题描述】:

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

这里是c#代码:

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

希望有人可以提供帮助,并且我不需要创建一个完整的班级来做到这一点。

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

【问题讨论】:

  • 你用什么java库来处理json?
  • string JSON 的形状是什么?
  • Org.json 和 Gson。字符串在这里 "\/Date(1630050818893+0300)\/"
  • 请编辑问题以将其限制为具有足够详细信息的特定问题,以确定适当的答案。

标签: java json deserialization


【解决方案1】:

由于您尝试反序列化旧的 .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 +
                '}';
    }
}

【讨论】:

  • 我可能搞错了。我这样做了: String json = "/Date(1630050818893+0300)/"; String objectWithDate = gson.fromJson(json, String.class);并为 String objectWithDate 行收到此错误:com.google.gson.stream.MalformedJsonException: Expected value at line 1 column 1 path $
  • 您确实犯了一个错误,因为您提供的输入不是有效的 JSON。输入内容如下:"{\"date\":\"\\/Date(1630050818893+0300)\\/\"}" 其中date 将是您的 Java 类型中的一个字段。
  • 请原谅我缺乏知识。现在我尝试了这个: String objectWithDate = gson.fromJson("{\"date\":\"\\/Date(1630050818893+0300)\\/\"}", String.class);并得到了这个错误:期望一个字符串,但在第 1 行第 2 列路径 $ 处是 BEGIN_OBJECT
  • 我已经更新了我的答案。您不能将 JSON 对象反序列化为 String 对象。它应该遵循示例注释:Date date = gson.fromJson("{\"date\":\"\\/Date(1630050818893+0300)\\/\"}", ObjectWithDate.class).getDate();
猜你喜欢
  • 2022-01-08
  • 2016-08-04
  • 2015-01-25
  • 2016-02-01
  • 2021-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-12
相关资源
最近更新 更多