2011-02-11 15 views
9

में पार्स करना मेरे पास एक डब्ल्यूसीएफ सेवा है जो एक सीएलआर ऑब्जेक्ट देता है।एक JSON दिनांक जानकारी को सी # डेटटाइम

[DataContract] 
public class Person 
{ 
    [DataMember] 
    public string FullName 
    { 
    get { return fullName; } 
    set { id = fullName; } 
    } 
    private string fullName = string.Empty; 

    [DataMember] 
    public DateTime BirthDate 
    { 
    get { return birthDate; } 
    set { birthDate = value; } 
    } 
} 

इस वस्तु के उदाहरण बनाया है और मेरी WCF सेवा से लौटे किया जा रहा है: इस वस्तु के रूप में निम्नानुसार परिभाषित किया गया है। यह सेवा निम्न की तरह दिखती है:

[OperationContract] 
[WebGet(UriTemplate = "/GetPersonByID/{id}", ResponseFormat = WebMessageFormat.Json)] 
public Person GetPersonByID(string id) 
{ 
    Person person = FindPersonByID(id); 
    return person; 
} 

जब मुझे अपने आवेदन में प्रतिक्रिया वापस मिलती है, तो मैं सफलतापूर्वक पूर्णनाम मान निकाल सकता हूं। हालांकि, मैं अपने क्लाइंट एप्लिकेशन में जन्मदिन को सी # डेटटाइम ऑब्जेक्ट में कनवर्ट करने में सफलतापूर्वक सक्षम नहीं हुआ हूं। एक सी # समयदिनाँक उदाहरण में

\/Date(1297367252340-0500)\/ 

मुझे लगता है कि कैसे मिलता है: जब एक स्ट्रिंग के लिए परिवर्तित, जन्मतिथि कुछ इस तरह लग रहा है?

धन्यवाद!

आप System.Web.Script.Serialization.JavaScriptSerializer से (System.Web.Extensions.dll में) deserialize विधि का उपयोग कर सकते हैं:

+1

JSON दिनांक जैसी कोई चीज़ नहीं है। – JeremyP

उत्तर

5

यहाँ दो विकल्प हैं।

या आप System.Runtime.Serialization.Json.DataContractJsonSerializer (System.Runtime.Serialization.dll में या System.ServiceModel.Web.dll में .NET 3.5 में) से ReadObject विधि का उपयोग कर सकते हैं।

string dateString = @"""\/Date(1297367252340-0500)\/"""; 
+0

समस्या यह है कि, मेरा ग्राहक सिल्वरलाइट एप्लिकेशन है। सिल्वरलाइट में Deserialize विधि नहीं है। – user70192

+0

क्या आप DataContractJsonSerializer को आज़माने के लिए टेबल हैं? दस्तावेज़ों का दावा है कि यह सिल्वरलाइट 3 और 4 में उपलब्ध है। –

4

कारण तारीख में ये अजीब प्रारूप में है कि दिनांक समय WCF में एक आदिम है:

सुनिश्चित करें कि आपके तारीख की तरह उद्धरण में लपेटा जाता है सुनिश्चित करें। दुर्भाग्यवश, JSON में दिनांक और समय क्रमबद्ध करने के लिए कोई सार्वभौमिक मानकीकृत प्रारूप नहीं है - विभिन्न ढांचे विभिन्न स्ट्रिंग स्वरूपों का उपयोग करते हैं।

दुविधा यह है कि डब्ल्यूसीएफ को मूल रूप से समझने की आवश्यकता है कि तार पर एक विशेष स्ट्रिंग वास्तव में एक डेटटाइम है, न केवल एक और सादा वेनिला JSON स्ट्रिंग। इसलिए अजीब प्रारूप। जैसे ही DataContractJsonSerializer \/Date से शुरू होने वाली तारीख से मुकाबला करता है, यह एक तिथि के रूप में इसे पार्स करने का प्रयास करना शुरू कर देता है।

अब, अपने प्रश्न का उत्तर देने के लिए, जब आप तार पर डेटटाइम भेज रहे हैं, तो यह इस बात पर निर्भर करता है कि आप एक वेब ब्राउज़र क्लाइंट, सिल्वरलाइट क्लाइंट या डब्ल्यूसीएफ क्लाइंट का उपयोग कर रहे हैं या नहीं।

एक डब्ल्यूसीएफ क्लाइंट या सिल्वरलाइट 2+ क्लाइंट को इसमें कोई समस्या नहीं होनी चाहिए - उन्हें डेटाकंट्रैक्टजसोसेरिएलाइज़र का स्वतः उपयोग करना चाहिए, और यदि वे इसका उपयोग नहीं कर रहे हैं, तो आप डीसीजेएस मैन्युअल रूप से प्लग कर सकते हैं।

यदि आप एक वेब क्लाइंट का उपयोग कर रहे हैं, तो आप एएसपी के साथ जहाजों की .js फ़ाइल शामिल कर सकते हैं। नेट AJAX (मुझे विश्वास है कि इसे MicrosoftAspNetAjax.js, या MicrosoftAjax.cs कहा जाता है, हालांकि नाम बदल सकता है)। इसका deserialize समारोह इन तिथियों को स्वत: पार्स भी करेगा।

आशा है कि मदद करता है!

+0

बस इतना कहने से कहीं अधिक उपयोगी और सूचनात्मक उत्तर JSON दिनांक जैसी कोई चीज़ नहीं है। – jk7

1

इस दौरान फेंका त्रुटियों के कारण मैं एक Android मोबाइल (Xamarin स्टूडियो) एप्लिकेशन परियोजना जहाँ मैं Newtonsoft Json (Json.NET) का उपयोग करने में असमर्थ था पर काम करने के लिए किया था मेरी समस्या

using System.Web.Script.Serialization; 


//code 
JavaScriptSerializer json_serializer = new JavaScriptSerializer(); 
DateTime ddate = json_serializer.Deserialize<DateTime>(@"""\/Date(1326038400000)\/""").ToLocalTime(); 
3

खैर हल, हाल ही में इस विशिष्ट डिवाइस संस्करण पर तैनाती (एंड्रॉइड एपीआई 16 संस्करण 4.2.1)।

सौभाग्य से मुझे जेसन (सिस्टम) के लिए एक वैकल्पिक लाइब्रेरी मिली।JSON)। हालांकि इस पुस्तकालय में जेएसओएन तिथि को सी # डेटटाइम पर कास्टिंग करने का कोई तरीका नहीं है। (यानी/तिथि (1389435240000 + 0000) /)

मैं एक स्ट्रिंग json तारीख से नल की तारीख और तारीख रूपांतरण के लिए निम्न दो कार्य बनाया है

कोड सुधार किया जा सकता है, लेकिन यह अब

के लिए काम करता है
public static DateTime? ConvertToNallableDate(string date) 
     { 

      DateTime? val = null; 
      /*   /Date(1389435240000+0000)/*/ 
      try{ 
       if(!string.IsNullOrEmpty(date)) 
       { 
        date = date.Replace ("/Date(", string.Empty).Replace (")/", string.Empty); 
        int pIndex = date.IndexOf ("+"); 
        if(pIndex < 0) pIndex = date.IndexOf("-"); 
        long millisec = 0; 
        date = date.Remove (pIndex); 
        long.TryParse (date, out millisec); 
        System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("en-GB"); 
        DateTime newDate = DateTime.Parse ("1970,1,1", ci); 
        newDate = newDate.AddMilliseconds(millisec); 
        val = newDate == null ? (DateTime?)null : newDate; 

       } 
      }catch { 
       val = null; 
      } 
      return val; 
     } 

     public static DateTime ConvertToDate(string date) 
     { 

      DateTime val = new DateTime(); 
      /*/Date(1389435240000+0000)/*/ 
      try{ 
      if(!string.IsNullOrEmpty(date)) 
      { 
       date = date.Replace ("/Date(", string.Empty).Replace (")/", string.Empty); 
       int pIndex = date.IndexOf ("+"); 
       if(pIndex < 0) pIndex = date.IndexOf("-"); 
       long millisec = 0; 
       date = date.Remove (pIndex); 
       long.TryParse (date, out millisec); 
       System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("en-GB"); 
       DateTime newDate = DateTime.Parse ("1970,1,1", ci); 
       val = newDate.AddMilliseconds(millisec); 

      } 
      }catch { 
       val = new DateTime(); 
      } 
      return val; 
     } 
+0

जेसन तिथि में कोई टाइमज़ोन प्रत्यय नहीं है तो टूट जाता है –

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