2014-11-13 21 views
5

मैं एक एंड्रॉइड एप्लिकेशन विकसित कर रहा हूं जो कुछ Google ऐप इंजन वेब-सेवाओं के साथ संवाद करता है।जैक्सन/जीसन पुस्तकालयों के साथ पार्स किए गए गलत डेटटाइम (मिनट) को कैसे ठीक किया जाए?

यह एप्लिकेशन एक चैट गतिविधि लागू करता है जिसमें बहुत ही सरल सुविधा है: टेक्स्ट भेजें।

डीबगिंग के दौरान मैंने देखा कि सर्वर से जो संदेश मैं सूचीबद्ध कर रहा था, उसी क्रम में प्रदर्शित नहीं किया गया था जिसे मैंने उन्हें अपने आवेदन पर भेजा था। मेरा पहला विचार था कि समस्या सर्वर से आ रही थी।

सबसे पहले मैं कच्चे Json जाँच की मैं प्राप्त था:

{ 
"messages": [ 
    { 
    "message": "test 3", 
    "author": "daniel", 
    "message_id": "5724160613416960", 
    "sent_at": "2014-11-13T09:42:42.861950" 
    }, 
    { 
    "message": "test 2", 
    "author": "daniel", 
    "message_id": "5649050225344512", 
    "sent_at": "2014-11-13T09:42:10.390960" 
    }, 
    { 
    "message": "test 1", 
    "author": "daniel", 
    "message_id": "5178081291534336", 
    "sent_at": "2014-11-13T09:41:01.998830" 
    } 
], 
"kind": "company#chatsItem", 
"etag": "\"RUCkC9XynEQNZ2t5E0aa41edXro/xRNtgkWIUbq4zCgmv2iq2fy-UIg\"" 
} 

आप देख सकते हैं, कच्चे डेटा सही ढंग से आदेश दिया है। लेकिन यहां मजाकिया हिस्सा आता है। जब मैं इस तरह के JacksonFactory (या यहां तक ​​GsonFactory) के रूप में एक JSON पार्सर, जोड़ें:

[0] = {[email protected]6} size = 4 
[0] = {[email protected]}"author" -> "daniel" 
[1] = {[email protected]}"message" -> "test 3" 
[2] = {[email protected]}"message_id" -> "5724160613416960" 
[3] = {[email protected]}"sent_at" -> "2014-11-13T10:57:03.950+01:00" 

[1] = {[email protected]6} size = 4 
[0] = {[email protected]}"author" -> "daniel" 
[1] = {[email protected]}"message" -> "test 2" 
[2] = {[email protected]}"message_id" -> "5649050225344512" 
[3] = {[email protected]}"sent_at" -> "2014-11-13T10:48:40.960+01:00" 

[2] = {[email protected]8} size = 4 
[0] = {[email protected]}"author" -> "daniel" 
[1] = {[email protected]}"message" -> "test 1" 
[2] = {[email protected]}"message_id" -> "5178081291534336" 
[3] = {[email protected]}"sent_at" -> "2014-11-13T10:57:39.830+01:00" 

क्यों इस तरह के एक यादृच्छिक अंतर है:

Company.Builder builder = new Company.Builder(AndroidHttp.newCompatibleTransport(), new JacksonFactory(), null); 
Company service = builder.build(); 
ChatsChatCollectionResponse response = service.chats().list(user_id, album_id, token).execute(); 
List<ChatsChatResponse> messagesResponse = response.getMessages(); 

यहाँ ChatsChatResponse आइटम के रूप में ऊपर उसी तरह का आदेश दिया हैं "sent_at" फ़ील्ड पर?

संपादित मुझे लगता है कि मैं 1 घंटे पारी कि समयक्षेत्र से मेल खाती है के बारे में बात नहीं कर रहा, बल्कि पर कैसे यादृच्छिक मिनट कर रहे हैं उल्लेख करना भूल गया।

+0

आप 'ChatsChatResponse' के लिए POJO परिभाषा में शामिल कर सकता है? यह जानना महत्वपूर्ण है कि डेटाटाइप का क्या उपयोग किया जा रहा है। ऐसा लगता है कि आप जैक्सन आधारित deserializer का उपयोग कर रहे हैं, तो जैक्सन का संस्करण भी मायने रख सकता है: आप नवीनतम पैच संस्करण का उपयोग करके भी आपको सत्यापित करना चाहते हैं। – StaxMan

उत्तर

3

मैं समाधान के बारे में यकीन नहीं है, लेकिन स्पष्टीकरण काफी स्पष्ट लगता है: भिन्नता बिल्कुल यादृच्छिक नहीं है, बल्कि मिलीसेकेंड के रूप में दशमलव बिंदु के बाद सब कुछ जोड़ने की वजह से।

उदाहरण के लिए, तीसरे प्रवेश लें:

2014-11-13T09:41:01.998830 

जाहिर है, पार्सर इस रूप में पढ़ता है:

hours: 09 
minutes: 41 
seconds: 01 
milliseconds: 998830 

मिलीसेकेंड के बाद से 1000 की तुलना में अधिक है, यह समाप्त होता है 998s 830ms के रूप में तब्दील किया जा रहा है, जो जब पूर्ण मिनट के लिए लेखांकन 16m 38s 830ms है। इसलिए:

hours: 09 
minutes: 41 + 16 
seconds: 01 + 38 
milliseconds: 830 

कौन वास्तव में पैदा करता है परिणाम आप देख रहे हैं (सापेक्ष समय क्षेत्र समायोजन):

2014-11-13T10:57:39.830+01:00 

आप सेवा उत्पादन पर नियंत्रण (इस बिंदु सवाल शब्दों से काफी स्पष्ट नहीं है है, तो), सबसे आसान फिक्स दशमलव बिंदुओं के बाद केवल तीन अंकों को आउटपुट करना होगा (यानी लाखों के बजाय मिलीसेकंड पर गोल करना)। उदाहरण के लिए, यह 2014-11-13T09:41:01.999 होगा।

इसे पार्सर पर स्वयं ठीक करना भी संभव हो सकता है, लेकिन इसके लिए थोड़ा अधिक शोध (और आदर्श रूप से, एक समस्या जो समस्या को पुन: उत्पन्न करती है) की आवश्यकता होगी।।

1

तरह

Gson gson = नए GsonBuilder() setDateFormat (": mm: yyyy-MM-dd'T'HH ss.SSS") एक कस्टम दिनांक स्वरूप सेट करके देखें। Create() ;

0

जैसा कि @ मतिश ने नोट किया है, आपके पास एक गैर मानक मानक प्रारूप है जिसमें माइक्रोसेकंड शामिल हैं। समस्या यह है कि SimpleDateFormat, जैक्सन द्वारा उपयोग किया गया, incorrectly parses microseconds

कम करने के लिए यह आपको लगता है कि मिलीसेकेंड के लिए माइक्रोसेकंड ट्रंकेटस एक कस्टम deserializer बनाना चाहिए:

public class MicrosecondDateSerializer extends JsonDeserializer<Date> { 

    private static SimpleDateFormat formatter = 
    new SimpleDateFormat("dd-MM-yyyyThh:mm:ss:SSS"); 

    @Override 
    public Date deserialize(JsonParser jp, DeserializationContext ctxt) 
     throws IOException, JsonProcessingException { 

    ObjectCodec oc = jp.getCodec(); 
    JsonNode node = jp.getCodec().readTree(jp); 
    String dateString = node.get("sent_at").asText(); 
    String dateStringTruncated = dateString.substring(0, dateString.length() - 3); 

    return formatter.parse(dateStringTruncated); 
    } 
} 
संबंधित मुद्दे

 संबंधित मुद्दे