.NET ऑब्जेक्ट के लिए जॉयजेक्ट को डिसेर्बलाइज कैसे करें


241

मैं न्यूटनसॉफ्ट JSON लाइब्रेरी का खुशी से उपयोग करता हूं । उदाहरण के लिए, मैं JObjectएक .NET ऑब्जेक्ट से बनाऊंगा, इस मामले में अपवाद का उदाहरण (एक उपवर्ग हो सकता है या नहीं भी हो सकता है)

if (result is Exception)
    var jobjectInstance = JObject.FromObject(result);

अब मुझे पता है कि पुस्तकालय JSON पाठ (यानी एक स्ट्रिंग) को किसी वस्तु से अलग कर सकता है

// only works for text (string)
Exception exception = JsonConvert.DeserializeObject<Exception>(jsontext); 

लेकिन मैं जो देख रहा हूं वह है:

// now i do already have an JObject instance
Exception exception = jobjectInstance.????

वैसे यह स्पष्ट है कि मैं JObjectJSON पाठ पर वापस जा सकता हूं और फिर डीसर्विलाइज़ कार्यक्षमता का उपयोग कर सकता हूं , लेकिन यह मुझे पीछे की ओर लगता है।

जवाबों:


489

इस पोस्ट के अनुसार , यह अब बेहतर है:

// pick out one album
JObject jalbum = albums[0] as JObject;

// Copy to a static Album instance
Album album = jalbum.ToObject<Album>();

प्रलेखन: JSON को एक प्रकार में बदलें


10
प्रदर्शन पर कोई विचार यहाँ निहितार्थ? क्या हर बार प्रतिबिंब का उपयोग किया जाएगा?
शॉन रोवन

1
क्या कस्टम JsonConverter के साथ ऐसा करना संभव है?
जस्टिन स्काइल्स

3
संकेत के लिए धन्यवाद। इसने मेरी बहुत मदद की। मुझे कुछ जोड़ने दें: एक सामान्य विधि में, जहां मैं टाइप का उपयोग कर Tरहा हूं, मुझे result=(value is JObject) ? ((JObject)value).ToObject<T>() : (T)default(T);इसे सफलतापूर्वक रूपांतरित करने के लिए कुछ की आवश्यकता है (ध्यान दें - valueएक डेटाबेस से आने वाली एक वस्तु है जो जोबजेक्ट या कुछ और हो सकती है जिसमें मामले का परिणाम शून्य होना चाहिए)।
मैट

@ShaunRowan Linqpad में कोड के साथ खेल रहा है, ऐसा लगता है कि प्रतिबिंब को JSON ऑब्जेक्ट में संबंधित फ़ील्ड के रूप में लक्ष्य ऑब्जेक्ट के समान "स्तर" पर गुण मिलान करने के लिए उपयोग किया जाता है। आपकी संपत्ति के नाम को JSON फ़ील्ड के नाम से मेल खाना है, और आपकी संपत्ति का प्रकार एक संगत प्रकार होना चाहिए।
बॉबी १A

और उपयोग करें jobject.ToObject(myObject.GetType())यदि आप ऑब्जेक्ट प्रकार नहीं जानते हैं।
Tohid

45

प्रलेखन से मुझे यह मिला

JObject o = new JObject(
   new JProperty("Name", "John Smith"),
   new JProperty("BirthDate", new DateTime(1983, 3, 20))
);

JsonSerializer serializer = new JsonSerializer();
Person p = (Person)serializer.Deserialize(new JTokenReader(o), typeof(Person));

Console.WriteLine(p.Name);

Personनिम्न के लिए कक्षा की परिभाषा संगत होनी चाहिए:

class Person {
    public string Name { get; internal set; }
    public DateTime BirthDate { get; internal set; }
}

संपादित करें

यदि आप JSON.net के हालिया संस्करण का उपयोग कर रहे हैं और कस्टम क्रमांकन की आवश्यकता नहीं है, तो कृपया ऊपर TienDo का उत्तर देखें (या नीचे यदि आप मुझे upvote करते हैं: P), जो अधिक संक्षिप्त है।


2
मुझे इस दृष्टिकोण का उपयोग करने की आवश्यकता थी, शॉर्टहैंड के बजाय, कस्टम क्रमांकन सेटिंग्स को पारित करने में सक्षम होने के लिए।
जस्टिन कैल्डिकॉट

सटीक ans मैं खोज रहा हूँ
VII

2

बहुत देर हो चुकी है, बस अगर कोई दूसरा रास्ता खोज रहा है:

void Main()
{
    string jsonString = @"{
  'Stores': [
    'Lambton Quay',
    'Willis Street'
  ],
  'Manufacturers': [
    {
      'Name': 'Acme Co',
      'Products': [
        {
          'Name': 'Anvil',
          'Price': 50
        }
      ]
    },
    {
      'Name': 'Contoso',
      'Products': [
        {
          'Name': 'Elbow Grease',
          'Price': 99.95
        },
        {
          'Name': 'Headlight Fluid',
          'Price': 4
        }
      ]
    }
  ]
}";

    Product product = new Product();
    //Serializing to Object
    Product obj = JObject.Parse(jsonString).SelectToken("$.Manufacturers[?(@.Name == 'Acme Co' && @.Name != 'Contoso')]").ToObject<Product>();

    Console.WriteLine(obj);
}


public class Product
{
    public string Name { get; set; }
    public decimal Price { get; set; }
}

यह बिलकुल स्वीकृत उत्तर जैसा दिखता है ।
21
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.