Json.NET के साथ किसी भी प्रकार की वस्तु को जोबजेक्ट में कनवर्ट करें


89

मुझे अक्सर WebAPI के साथ क्लाइंट को लौटाने से पहले अपने डोमेन मॉडल को अतिरिक्त जानकारी के साथ विस्तारित करने की आवश्यकता होती है। ViewModel के निर्माण से बचने के लिए मुझे लगा कि मैं अतिरिक्त गुणों के साथ जॉयजेक्ट वापस कर सकता हूं। हालाँकि मैं किसी भी प्रकार की वस्तु को न्यूबॉट्सॉफ्ट जेन्सन लाइब्रेरी के लिए सिंगल कॉल के साथ जोबजेक्ट में परिवर्तित करने का प्रत्यक्ष तरीका नहीं खोज सका। मैं कुछ इस तरह से आया:

  1. पहला SerializeObject
  2. तो परसे
  3. और JObject का विस्तार करें

उदाहरण के लिए .:

var cycles = cycleSource.AllCycles();

var settings = new JsonSerializerSettings
{
    ContractResolver = new CamelCasePropertyNamesContractResolver()
};

var vm = new JArray();

foreach (var cycle in cycles)
{
    var cycleJson = JObject.Parse(JsonConvert.SerializeObject(cycle, settings));
    // extend cycleJson ......
    vm.Add(cycleJson);
}

return vm;

मैं यह सही तरीका है?


17
JObject.FromObject(your_domain_object)वह है जो आप ढूंढ रहे हैं। देखिए @ LB का जवाब।
— ब्रायन रोजर्स

जवाबों:


123

जौबजेक्ट को IDEDIA लागू करता है, इसलिए आप इसे इस तरह से उपयोग कर सकते हैं। पूर्व के लिए,

var cycleJson  = JObject.Parse(@"{""name"":""john""}");

//add surname
cycleJson["surname"] = "doe";

//add a complex object
cycleJson["complexObj"] = JObject.FromObject(new { id = 1, name = "test" });

तो अंतिम जसन होगा

{
  "name": "john",
  "surname": "doe",
  "complexObj": {
    "id": 1,
    "name": "test"
  }
}

आप dynamicकीवर्ड का उपयोग भी कर सकते हैं

dynamic cycleJson  = JObject.Parse(@"{""name"":""john""}");
cycleJson.surname = "doe";
cycleJson.complexObj = JObject.FromObject(new { id = 1, name = "test" });

आपके उत्तर के लिए धन्यवाद। लेकिन मुझे साइकल का मूल्यांकन करते समय नीचे दिए गए json मिल रहे हैं, अतिरिक्त ब्रेस के साथ। मैं उस अतिरिक्त ब्रेस को कैसे निकाल सकता हूं ??? {"" नाम ":" जॉन "," उपनाम ":" डो "," कॉम्पलेक्सओबज ": {" आईडी ": 1," नाम ":" परीक्षण "}}}}
— रेम्य दिक्कुवेटिल

@remyathekkuvettil यह एक वैध जसन नहीं है। आपको कुछ तदर्थ स्ट्रिंग जोड़तोड़ की आवश्यकता है।
— LB

28

यदि आपके पास कोई वस्तु है और आप जोबजेक्ट बनने की इच्छा रखते हैं, तो आप इसका उपयोग कर सकते हैं:

JObject o = (JObject)JToken.FromObject(miObjetoEspecial);

इस तरह :

Pocion pocionDeVida = new Pocion{
tipo = "vida",
duracion = 32,
};

JObject o = (JObject)JToken.FromObject(pocionDeVida);
Console.WriteLine(o.ToString());
// {"tipo": "vida", "duracion": 32,}

9
सीधे नहीं (JObject) JToken.FromObject () के बजाय JObject.FromObject () क्यों नहीं?
— tomexou

यह मुझे एक दे दी हैSystem.InvalidCastException
— superninja

1

यह काम करेगा:

var cycles = cycleSource.AllCycles();

var settings = new JsonSerializerSettings
{
    ContractResolver = new CamelCasePropertyNamesContractResolver()
};

var vm = new JArray();

foreach (var cycle in cycles)
{
    var cycleJson = JObject.FromObject(cycle);
    // extend cycleJson ......
    vm.Add(cycleJson);
}

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