2010-03-06 12 views
10

मेरे पास एक flattened JSON है:क्या Json.NET डॉट नोटेशन के साथ एक flattened JSON स्ट्रिंग deserialize कर सकते हैं?

{ 
    "CaseName" : "John Doe v. State", 
    "CaseDate" : "<some date>", 
    "Client.FirstName" : "John", 
    "Client.LastName" : "Doe", 
    "Client.Email" : "[email protected]" 
    etc... 
} 

मैं इसे इस इकाई में वापस deserialize करना चाहता हूं:

public class Case() 
{ 
    public string CaseName { get; set; } 
    public string CaseDate { get; set; } 
    public Client Client { get; set; } 
} 

जहां Client.FirstName, Client.LastName, और Client.EmailClient ऑब्जेक्ट में गुण हैं। Json.NET का उपयोग करके, क्या यह डॉट नोटेशन को पार्स करने और इस इकाई को सही तरीके से deserialize करने के लिए कोई रास्ता है? वर्तमान में, डिफ़ॉल्ट सेटिंग्स का उपयोग करके, यह मुझे बताता है कि Client.FirstNameCase प्रकार में कोई प्रॉपर्टी नहीं है।

+0

यह JSON नहीं है। – ChaosPandion

+0

मैंने इसे और अधिक पठनीय बनाने के लिए इसे सरल बना दिया, लेकिन मैंने इसे संशोधित किया ताकि यह अब उचित JSON हो। कैओसपैंडियन की टिप्पणी पर विस्तार करने के लिए –

+0

- मानक तरीका यह दर्शाता है कि जेसन में नेस्टेड डेटा (क्लाइंट) {"केसनाम" जैसा होगा: "जॉन डो वी। स्टेट", "केसडेट": "", "क्लाइंट" {" फर्स्टनाम ":" जॉन "," लास्टनाम ":" डो "}}} यदि आउटपुट जेसन को बदलना संभव है तो यह @ कैस्परऑन के एसएलएन से बहुत तेज़ होगा। निर्भर करता है कि क्या आपके पास क्रमिकरण का नियंत्रण है? – MemeDeveloper

उत्तर

5

हाँ, आप कर सकते हैं। आप JsonConverter से कक्षा प्राप्त करेंगे और CanConvert विधि को इंडिके के लिए ओवरराइड करें कि आप Client प्रकार को परिवर्तित कर सकते हैं।

फिर, आप JSON शाब्दिक के फ़ील्ड पढ़ने और लिखने के लिए ReadJson और WriteJson विधियों को ओवरराइड करेंगे।

एक JSON इस तरह शाब्दिक के लिए, यह संभावना से भी अधिक है के रूप में आप क्रमबद्धता दौरान Client वस्तु के सभी गुण कैश करने के लिए जब तक आप वास्तव में बनाने के लिए पर्याप्त जानकारी की आवश्यकता होगी आप, Case प्रकार के लिए एक JsonConverter बनाने की आवश्यकता होगी Client उदाहरण।

उसके बाद, आप JsonSerializer उदाहरण आप अपने क्रमांकन/deserialization प्रदर्शन करने के लिए प्रयोग कर रहे हैं पर Converters property द्वारा उजागर JsonConverterCollection उदाहरण पर Add विधि कॉल करेगा।

ध्यान दें कि यदि आप यह है कि इस तरीके से प्रतिनिधित्व किया जा सकता है विभिन्न वर्गों के एक नंबर के लिए ऐसा करने की जरूरत है, तो आप एकJsonConverter कार्यान्वयन लिख सकते हैं, और यह संपत्ति पर एक विशेषता के लिए स्कैन की है। यदि संपत्ति में विशेषता है और गुणों के साथ किसी अन्य वस्तु का खुलासा करता है, तो यह डॉट-नोटेशन को पढ़ने/लिखने की उम्मीद करेगा।

यह ध्यान दिया जाना चाहिए कि जब आप पहचानकर्ता के लिए डॉट-नोटेशन का उपयोग कर रहे हैं, तो ऐसा करना बहुत असामान्य है। यदि संभव हो, ओर जाता है कि JSON शाब्दिक निर्माण पर, यह इस तरह से कर रही किया जाना चाहिए:

{ 
    CaseName: "John Doe v. State", 
    CaseDate: "<some date>", 
    Client: 
    { 
     FirstName: "John", 
     LastName: "Doe", 
     Email: "[email protected]" 
    } 
} 

लेकिन वह यह सोचते है आपको लगता है कि अंत पर नियंत्रण है कि। यदि आप नहीं करते हैं, तो आप इतना कुछ नहीं कर सकते हैं।

यदि आपके पास नियंत्रण है, तो उस तरीके से अपने JSON अक्षर तैयार करना कस्टम JsonConverter कार्यान्वयन की आवश्यकता को अस्वीकार कर देगा।

+1

हां, मैं इसे प्रेषक की तरफ (एक्स्टजेएस) पर सही रूप से परिवर्तित करना पसंद करूंगा, लेकिन मुझे यकीन नहीं है कि यह अभी तक संभव है या नहीं। आपके द्वारा प्रदान किया गया समाधान व्यावहारिक है, लेकिन मेरे ऑब्जेक्ट ग्राफ़ की इकाइयों और जटिलता की संख्या को देखते हुए बहुत अधिक काम किया जाता है। मैं एक साधारण ध्वज या अधिक सामान्य जेसन कनवर्टर की उम्मीद कर रहा था जो सभी डॉट नोटेशन गुणों के लिए लागू होगा। –

+1

@ डैनियल टी .: दुर्भाग्यवश, जेएसओएन गैर-मानक है, यही कारण है कि जेसन.नेट को इसके साथ समस्या है। हालांकि, मैंने यह इंगित करने के लिए उत्तर में एक पैराग्राफ जोड़ा है कि आप * एक * जेसन कनवर्टर कार्यान्वयन कैसे लिख सकते हैं, एक विशेषता के साथ संयुक्त होने पर इसे डॉट-नोटेशन पढ़ने/लिखने के लिए कहने के लिए कहा जाता है। – casperOne

0

हालांकि केवल आधा समस्या (यानी तथ्य आपके वस्तु चपटा कर दिया गया है के साथ मदद नहीं कर)

आप एक साधारण के साथ एक बहुत त्वरित और गंदी तरह से डॉट नोटेशन के साथ सौदा कर सकते हैं

MyTargetClass retVal 
= JsonConvert.DeserializeObject<MyTargetClass>(jsonAsString.Replace(".", "_")); 

MyTargetClass पर उपयुक्त "_" संपत्ति नामों के साथ कॉम्बो में

public class MyTargetClass 
{ 
    public string CaseName {get; set;} 
    public DateTime CaseDate {get; set;} 
    public string Client_FirstName {get; set;} 

    //Other Properties 
} 
संबंधित मुद्दे