2017-01-09 4 views
-1

я следующий JSON из MongoDB:Как сериализовать объект ISODate в Gson?

{ 
    "_id" : "123", 
    "ip" : "127.0.0.1", 
    "start_time" : ISODate("2016-12-28T17:16:08.283Z"), 
    "end_ocr_time" : ISODate("2016-12-28T17:16:11.652Z"), 
    "end_addr_time" : ISODate("2016-12-28T17:16:12.978Z") 
} 

В тексте это выглядит как

{ "_id" : "D87AFF58-EF20-49E0-AED9-15C5DEF59F9D" , "ip" : "A77K1ARM045" , "start_time" : { "$date" : "2016-12-26T07:03:57.612Z"} , "end_ocr_time" : { "$date" : "2016-12-26T07:04:01.313Z"} , "end_addr_time" : { "$date" : "2016-12-26T07:04:03.524Z"} 

класс Модель:

class DBrecord { 

    private String _id; 
    private String ip; 
    private Date start_time; 
    private Date end_ocr_time; 
    private Date end_addr_time; 

} 

Я пробовал:

Gson gson = new Gson(); 
DBrecord dBrecord = gson.fromJson(cursor.next().toString(), DBrecord.class); 

Ресул т:

java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1 column 56 path $.start_time 

также попытался сделать Gson в соответствии с другими SO ответов:

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

и получил:

com.google.gson.JsonParseException: The date should be a string value 

Пытался сделать десериализатор:

GsonBuilder gb = new GsonBuilder(); 
      gb.registerTypeAdapter(DBrecord.class, new JsonDeserializer<Date>() 
      { 

       DateFormat format = DateFormat.getInstance(); 

       @Override 
       public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) 
         throws JsonParseException 
       { 
        try 
        { 
         return format.parse(((JsonObject)json).get("start_time").getAsString()); 
        } 
        catch (ParseException e) 
        { 
         throw new JsonParseException(e); 
        } 
       } 
      }); 
      Gson gson = gb.create(); 

и получил ошибку третьего типа:

java.lang.UnsupportedOperationException: JsonObject 

Как этот формат даты - ISODate («2016-12-28T17: 16: 08.283Z») можно десериализовать с помощью Gson?

+2

Это не действует в формате JSON. Покажите нам фактическое текстовое представление. –

+0

Это, я открываю коллекцию в Robomongo, нажмите правую кнопку мыши на входе и выберите «Копировать JSON». –

+0

ну я не думаю, что вы можете. MongoDB использует расширенный json. Вместо этого вам понадобится парсер BSON mongodb, но он также должен включать типы. Не знаю, почему robomongo не создает типы. – Veeram

ответ

1

Я проверил, как JSON выглядит на Java, и он отличается от Robomongo, как было сказано в комментариях. В режиме отладки JSON строка выглядит следующим образом:

{ "_id" : "66800E64-AABF-45A8-BA37-FA9D1FF65EB6" , "ip" : "ALIMKIN-EM9" , "start_time" : { "$date" : "2016-12-22T07:19:42.790Z"} , "end_ocr_time" : { "$date" : "2016-12-22T07:19:48.692Z"} , "end_addr_time" : { "$date" : "2016-12-22T07:19:56.638Z"}} 

Так что я только что сделал класс для даты:

private ISODate start_time; 
private ISODate end_ocr_time; 
private ISODate end_addr_time; 
private ISODate end_oper_time; 
class ISODate { 
    private Date $date; 
    ISODate() { 
     $date = new Date(0); 
    } 
    public Date get$date() { 
     return $date; 
    } 
} 
+0

Я незнаком с mongodb, так что это просто вопрос любопытства - почему бы вам просто не сохранить фактическую строку даты iso? Меня смущает тот факт, что ваш бизнес-объект должен внедрять детали реализации. – Sebas

+0

Так как MongoDB сохраняет дату по часовой стрелке по умолчанию, я думаю. Не уверен, хотя, я беру данные только из этого db и даже не знаю, кто их создал и заполнил, и почему это выглядит так. –

+1

Как любопытно. Может быть, ORM аннулирует эту часть для вас? Вы пытались использовать java-библиотеки mongodb? Я был бы осторожен перед созданием объекта 'ISODate', если бы вы были вами – Sebas

Смежные вопросы