Android/Java-Gson从JSON字符串到对象的解析-日期问题

Android/Java-Gson从JSON字符串到对象的解析-日期问题,java,android,json,date,gson,Java,Android,Json,Date,Gson,当我在Android中使用以下代码时: // convert JSON string to a List of Product objects Type listType = new TypeToken<List<Product>>(){}.getType(); p = (List<Product>)new Gson().fromJson(json, listType); 三个产品对象,其字段为int-ProductId,字符串名,双倍价格,布尔可见,可能还

当我在Android中使用以下代码时:

// convert JSON string to a List of Product objects
Type listType = new TypeToken<List<Product>>(){}.getType();
p = (List<Product>)new Gson().fromJson(json, listType);
三个产品对象,其字段为
int-ProductId
字符串名
双倍价格
布尔可见
,可能还有其他一些字段


当我对订单(JSON中包含一个C#DateTime)尝试同样的方法时,它失败了,出现了一个
JsonSyntaxException:2014-05-13T00:00:00

因此,我的问题是:如何将包含日期字符串(
2014-05-13T00:00:00
)的
JSON字符串成功转换为
Java.util.Date
对象

我确实尝试了以下方法:

// convert JSON string to a List of Order objects
Type listType = new TypeToken<List<Order>>(){}.getType();
Gson gson = new GsonBuilder().setDateFormat(DateFormat.FULL).create();
o = (List<Order>)gson.fromJson(json, listType);
//将JSON字符串转换为订单对象列表
类型listType=newTypeToken(){}.getType();
Gson Gson=new GsonBuilder().setDateFormat(DateFormat.FULL).create();
o=(List)gson.fromJson(json,listType);

//将JSON字符串转换为订单对象列表
类型listType=newTypeToken(){}.getType();
Gson Gson=new GsonBuilder().setDateFormat(DateFormat.FULL,DateFormat.FULL).create();
o=(List)gson.fromJson(json,listType);
但两者都不起作用

注意:我用谷歌搜索了一下,大多数解决方案在Java代码和使用的API中都使用了
序列化器和反序列化器。但是,由于我无法修改我的
JSON
send from我的C#webapi,这对我来说不是一个选项。我只能在接收器端添加东西(我的Android应用程序)

PS:我可能有一个解决方案,尽管这是一个额外的工作&包含一个可能会减慢的for循环:我将
Order类中的
日期
更改为
字符串日期
(因此Gson解析会将其放在该字符串字段中),然后添加一个
Date mDate
,在
Gson
解析完订单的完整
JSON数组之后,我在for循环中将
Dates
解析为
mDate
。。尽管如此,这个解决方案效率很低,所以如果有人知道如何在GsonBuilder中实现它,我将不胜感激


提前感谢您的回复。

好的,我很接近,但犯了一个很小的错误

而不是:

Gson gson = new GsonBuilder().setDateFormat(DateFormat.FULL, DateFormat.FULL).create();
我需要使用:

Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss").create();

编辑:

我现在也使用反序列化程序,但只在我的Android部分使用。我更改它的原因如下:

  • 当我有一个不同格式的日期或一个空的日期时,我会在整个JSON上得到一个JsonParseException,因此没有创建任何Order对象
  • 现在,我使用这个seralizer,并且日期的格式无效或为null,它只会使Order对象中的日期为null,但仍然会使用生成的Order列表转换所有内容
代码:

试试看{
//将JSON字符串转换为Order对象列表
类型listType=newTypeToken(){}.getType();
GsonBuilder GsonBuilder=新的GsonBuilder();
gsonBuilder.registerTypeAdapter(Date.class,新的JsonDeserializer()){
DateFormat df=新的SimpleDataFormat(“yyyy-MM-dd'T'HH:MM:ss”,Locale.ENGLISH);
@凌驾
公共日期反序列化(JsonElement json,类型typeOfT,JsonDeserializationContext)引发JsonParseException{
试一试{
返回df.parse(json.getAsString());
}
捕获(解析异常){
返回null;
}
}
});
Gson dateGson=gsonBuilder.create();
orders=dateGson.fromJson(json,listType);
}
捕获(JsonParseException ex){
例如printStackTrace();
}
Gson gson = new GsonBuilder().setDateFormat(DateFormat.FULL, DateFormat.FULL).create();
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss").create();
try{
    // Convert JSON-string to a List of Order objects
    Type listType = new TypeToken<ArrayList<Order>>(){}.getType();
    GsonBuilder gsonBuilder = new GsonBuilder();
    gsonBuilder.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss", Locale.ENGLISH);
        @Override
        public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
            try{
                return df.parse(json.getAsString());
            }
            catch(ParseException ex){
                return null;
            }
        }
    });
    Gson dateGson = gsonBuilder.create();
    orders = dateGson.fromJson(json, listType);
}
catch(JsonParseException ex){
    ex.printStackTrace();
}