Android/Java - Gson将JSON字符串解析为对象 - 日期问题

3

当我在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);

它将会转换:

[{"$id":"1","ProductId":17,"Name":"Product1","Price":1.49,"Visible":true},
{"$id":"2","ProductId":19,"Name":"Product2","Price":3.89,"Visible":true},
{"$id":"3","ProductId":20,"Name":"Product3","Price":0.32,"Visible":true}]

使用具有字段int ProductId、String Name、double Price、boolean Visible以及其他一些字段的三个Product对象。
当我尝试使用包含C# DateTime的Orders进行相同操作时(JSON中),它会出现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);

并且

// convert JSON string to a List of Order objects
Type listType = new TypeToken<List<Order>>(){}.getType();
Gson gson = new GsonBuilder().setDateFormat(DateFormat.FULL, DateFormat.FULL).create();
o = (List<Order>)gson.fromJson(json, listType);

但两者都没有起作用。

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

附言:我可能有一个解决方案,尽管它需要额外的工作,并包含一个潜在减速的for循环:我将Order-class中的Date Date更改为String Date(因此Gson解析将其放入该字符串字段),然后添加一个Date mDate,在Gson解析完整个JSON-array订单后,我在一个循环中将Dates解析成mDates。不过,这种解决方案相当低效,如果有人知道如何在GsonBuilder内部完成它,我会非常感激。

感谢您提前提供的答复。

1个回答

4

好的,我离正确只差一点点,但是犯了一个小错误(而且相当明显)。

应该是:

Gson gson = new GsonBuilder().setDateFormat(DateFormat.FULL, DateFormat.FULL).create();

我需要使用:

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

编辑:

现在我也使用了反序列化器,但只针对我的Android部分。我改变它的原因如下:

  • 当我有一个格式不同的日期或者日期为空时,我会得到一个JsonParseException错误,整个JSON都无法解析,所以我的Order对象没有被创建。
  • 现在我使用了这个序列化器,如果出现无效格式或者为空的日期,它只是将Order对象中的该日期设置为null,但仍然按照应有的方式转换所有内容,并生成一个Order列表。

代码:

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();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接