2013-07-11 13 views
13

में सेरिअलाइज़ करें JSON.NET को बताना संभव है मेरे पास JSON डेटा के साथ एक स्ट्रिंग है? जैसेJSON.NET: जेसन स्ट्रिंग प्रॉपर्टी को जेसन ऑब्जेक्ट

public class Foo 
{ 
    public int Id; 
    public string RawData; 
} 

जो मैं इस तरह का उपयोग करें::

var foo = new Foo(); 
foo.Id = 5; 
foo.RawData = @"{""bar"":42}"; 

जो मैं चाहता हूँ इस तरह धारावाहिक जा करने के लिए:

{"Id":5,"RawData":{"bar":42}} 

मूल रूप से मैं असंरचित का एक टुकड़ा मैं इस तरह एक वर्ग है जेएसओएन के रूप में संग्रहीत परिवर्तनीय-लंबाई डेटा, मुझे इस डेटा को एक भाग के रूप में रखने के लिए पूरी तरह से क्रमबद्ध ऑब्जेक्ट की आवश्यकता है।

धन्यवाद।

संपादित करें: बस यह सुनिश्चित करने के लिए कि यह ठीक से समझा जाता है, यह एक तरफा क्रमिकरण है, यानी मुझे उसी वस्तु में वापस deserialize करने की आवश्यकता नहीं है; अन्य प्रणाली इस आउटपुट को संसाधित करेगी। मुझे JSON का हिस्सा बनने के लिए RawData की सामग्री की आवश्यकता है, केवल स्ट्रिंग नहीं।

public class RawJsonConverter : JsonConverter 
{ 
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     writer.WriteRawValue(value.ToString()); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 

    public override bool CanConvert(Type objectType) 
    { 
     return typeof(string).IsAssignableFrom(objectType); 
    } 

    public override bool CanRead 
    { 
     get { return false; } 
    } 
} 

तो यह के साथ अपने वर्ग को सजाने:

+0

हाँ यह संभव है देखते हैं, लेकिन क्या आप मुझे बता सकते हैं कि वास्तव में क्या उत्पादन की जरूरत है? वर्तमान में यह है: {"आईडी": 5, "रॉडाटा": "{\" बार \ ": 42}"} –

+0

@ रिवर, यह वही है जो मुझे चाहिए। मेरे पास जेएसओएन सामग्री के साथ एक स्ट्रिंग प्रॉपर्टी है जो मुझे लगता है कि इसे जेएसओएन पर क्रमबद्ध करने के उद्देश्य के लिए बेकार है। – port443

+0

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

उत्तर

16

आप एक कनवर्टर की जरूरत है कि ऐसा करने के लिए, यहाँ एक उदाहरण है

public class Foo 
{ 
    public int Id; 
    [JsonConverter(typeof(RawJsonConverter))] 
    public string RawData; 
} 

फिर, जब आप का उपयोग करें:

var json = JsonConvert.SerializeObject(foo, 
            new JsonSerializerSettings()); 
Console.WriteLine (json); 

यह आपका आउटपुट है:

{"Id":5,"RawData":{"bar":42}} 

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

संपादित करें: मैं एक अधिक कुशल समाधान के लिए मेरा उत्तर अद्यतन किया है, पिछले एक, क्रमानुसार करने तो deserialize करने के लिए आप के लिए मजबूर नहीं करता है।

+0

मुझे इसे स्वयं आज़माएं, लेकिन ऐसा लगता है कि यह मेरी समस्या हल करता है। धन्यवाद @Rivers। – port443

0

आप ऑब्जेक्ट प्रॉपर्टी जेसन को deserialize करने के लिए किसी अन्य प्रॉपर्टी का उपयोग कर सकते हैं।

public class Foo 
{ 
    public int Id; 
    public string RawData; 
    private object thisObject; 
    public object ThisObject 
    { 
     get 
     { 
      return thisObject ?? (thisObject = JsonConvert.DeserializeObject<object>(RawData)); 
     } 
    }   
} 
3

यह संभव है, कि JRaw का उपयोग कर अधिक sutable हो सकता है और comapct समाधान

this post

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