2013-02-16 17 views
5

में जैक्सन जेएसओएन लाइब्रेरी का उपयोग करके तारीख लौटा दी है। मैं जैक्सन JSON लाइब्रेरी का उपयोग कर अपने एंड्रॉइड एप्लिकेशन में सर्वर से JSON को पार्स कर रहा हूं।पार्सिंग एएसपी.नेट एमवीसी ने जावा

"/Date(1277931782420)/" 

मैं जानता हूँ कि मैं कुछ ऐसा करना चाहिए: हालांकि, पार्स करने के अनुरोध को जब भी मैं दिनांक समय प्राप्त इस प्रारूप में यह है के बाद से असफल

ObjectMapper om = new ObjectMapper(); 
om.setDateFormat(new TicksSinceFormat()); 

लेकिन मुझे पता नहीं है, तो मैं (सब पर SimpleDateFormat उपयोग कर सकते हैं और मैं किस प्रारूप स्ट्रिंग का उपयोग करूंगा?) या मुझे अपना खुद का डेटफॉर्मेट पार्सर लिखना होगा। इसलिए, अगर कोई कोड उदाहरण के साथ मदद कर सकता है तो मैं गंभीरता से सराहना करता हूं।

संपादित करें: ठीक है, पूरा कोड के लिए मेरा उत्तर देखें।

उत्तर

5

यह तो मैं उम्मीद मुश्किल साबित हुई:

यहाँ एक StackOverflow पोस्ट है कि ऐसा करने के लिए कोड प्रदान करता है

public class TicksSinceFormat extends DateFormat { 
    @Override 
    public StringBuffer format(Date date, StringBuffer buffer, FieldPosition field) { 
     long millis = date.getTime(); 

     return new StringBuffer("/Date(" + millis + ")/"); 
    } 

    @Override 
    public Date parse(String string, ParsePosition position) { 
     int start = string.indexOf("(") + 1; 
     int end = string.indexOf(")"); 

     String ms = string.substring(start, end); 
     Date date = new Date(Long.parseLong(ms)); 

     position.setIndex(string.length() - 1); // MUST SET THIS 
     return date; 
    } 

    @Override 
    public Object clone() { 
     return new TicksSinceFormat(); // MUST SET THIS 
    } 
} 

का उपयोग वर्ग तो अत्यंत सरल है, बस कार्य करें:

ObjectMapper om = new ObjectMapper(); 
om.setDateFormat(new TicksSinceFormat()) 

मुझे लगता है कि इसे बेहतर कोड किया जा सकता है + जब .NET Ticks VS Java ticks की बात आती है तो मुझे मतभेदों से निपटने की आवश्यकता होगी - लेकिन अब यह होगा ओ। अगर किसी के पास बेहतर समाधान या उल्लिखित समस्याओं में अधिक अंतर्दृष्टि है तो मैं बाद में सौदा करूँगा - पोस्ट करने के लिए स्वतंत्र महसूस करें और यदि यह बेहतर है तो मैं आपके उत्तर को सही के रूप में चिह्नित कर दूंगा।

संपादित करें: जैसा कि मैंने इस question & answer में समझाया है, मैंने सेवास्टैक पर स्विच किया है। सर्वर पर आगे लाइब्रेरी और यह अलग-अलग, ISO8601 प्रारूप देता है। उस प्रारूप के लिए मैं थोड़ा अलग पार्सिंग का उपयोग कर रहा हूं (क्योंकि जैक्सन को ISO8601 को पार्स करने में परेशानी है जिसमें मिलीसेकंड शामिल हैं)। बेशक, अन्य कोड के साथ के रूप में मैं पोस्ट कर रहा हूँ - मुझे पता है कि तुम बेहतर संस्करण पूछना चाहते हैं तो (सिर्फ पोस्ट करें कोड/इस पोस्ट को संपादित, बल्कि यह कैसे किया जाना चाहिए पर दार्शनिक बयानबाजी का सहारा से):

@SuppressLint("SimpleDateFormat") 
public class JacksonSimpleDateFormat extends SimpleDateFormat { 
    public JacksonSimpleDateFormat() { 
     if (mParser == null) { 
      mParser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); 
      mParser.setTimeZone(TimeZone.getTimeZone("UTC")); 
     } 
    } 

    @Override 
    public StringBuffer format(Date date, StringBuffer buffer, FieldPosition field) { 
     return mParser.format(date, buffer, field); 
    } 

    private static SimpleDateFormat mParser; 
    @Override 
    public Date parse(String string, ParsePosition position) { 
     String str = string.split("\\.")[0]; 

     Date date = null; 
     try { 
      date = mParser.parse(str); 
     } catch (ParseException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     position.setIndex(string.length() - 1); 
     return date; 
    } 

    @Override 
    public Object clone() { 
     return new JacksonSimpleDateFormat(); 
    } 
} 
+1

ऐसा लगता है कि आपके कोड को ठीक काम करना चाहिए ... केवल एक ही परिवर्तन जो मैं करूँगा वह आपके 'पार्स' विधि में एक RegEx कैप्चर समूह का उपयोग कर रहा है , string.indexOf/string.substring के बजाय। यह सिर्फ एक स्टाइल चीज है ... मैंने हमेशा स्ट्रिंग.इंडेक्स/सबस्ट्रिंग को कुछ हद तक भंगुर और सूचकांक/लंबाई के संबंध में काम करने के लिए मुश्किल पाया है। बस मेरी विनम्र राय। –

+0

@ फिलिपटेन केयर मुझे एक मजबूत रेगेक्स और कोड प्रदान करने के लिए जो निश्चित रूप से काम करेगा? – kape123

3

मैं, इस पर गलत हो सकता है के रूप में मैं Android विकास में बहुत दूर नहीं मिला है, लेकिन प्रारूप आप प्रस्तुत:

"/Date(1277931782420)/" 

यूनिक्स काल समय प्रतीत होता है।

यदि ऐसा है, तो आप SimpleDateFormat का उपयोग नहीं करना चाहते/चाहेंगे। इसके बजाय, Long इसे बनाने का प्रयास करें और Date कन्स्ट्रक्टर तक पहुंचने का प्रयास करें, चाहे वह सेकंड या मिलीसेकंड-आधारित युग मूल्य है या नहीं। https://stackoverflow.com/a/535017/463196

+0

लिंक के लिए धन्यवाद - मैं इस पर काम कर रहा हूं, लेकिन कुछ अप्रत्याशित समस्याएं हैं (संपादन देखें) – kape123

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