2009-07-30 9 views

उत्तर

37

एक JValue केवल तार, ints, बूलियन्स, दिनांक और तरह तरह साधारण मान हो सकते हैं। इसमें एक जटिल वस्तु नहीं हो सकती है। मुझे लगता है कि तुम क्या वास्तव में चाहते हैं यह है:

List<User> list = LoadUsers(); 

JObject json = new JObject(); 

json["users"] = JToken.FromObject(list); 

ऊपर JObjects उपयोगकर्ताओं का प्रतिनिधित्व करने का एक JArray में User वस्तुओं की सूची में परिवर्तित कर देंगे, तो नए JObject पर users संपत्ति है कि निर्दिष्ट करते हैं। आप Typejson["users"] की संपत्ति की जांच करके इसकी पुष्टि कर सकते हैं और देख सकते हैं कि यह Array है।

इसके विपरीत, यदि आप json["users"] = new JValue(JsonConvert.SerializeObject(list)) करते हैं जैसा कि इस प्रश्न के उत्तर में अब दिया गया है (अब हटा दिया गया है), तो संभवतः आपको वह परिणाम नहीं मिलेगा जिसे आप ढूंढ रहे हैं। वह दृष्टिकोण उपयोगकर्ताओं की सूची को स्ट्रिंग में क्रमबद्ध करेगा, उसमें से एक सरल JValue बनाएं, और पर users संपत्ति पर JValue असाइन करें। यदि आप Typejson["users"] की संपत्ति की जांच करते हैं, तो आप देखेंगे कि यह String है। इसका अर्थ यह है कि, यदि आप बाद में को जेएसओएन में json.ToString() का उपयोग करके कनवर्ट करने का प्रयास करते हैं, तो आपको जेएसओएन की बजाय डबल-सीरियलाइज्ड आउटपुट मिलेगा।

यहाँ अंतर दर्शाने के लिए एक छोटी डेमो है:

class Program 
{ 
    static void Main(string[] args) 
    { 
     List<User> list = new List<User> 
     { 
      new User { Id = 1, Username = "john.smith" }, 
      new User { Id = 5, Username = "steve.martin" } 
     }; 

     JObject json = new JObject(); 

     json["users"] = JToken.FromObject(list); 
     Console.WriteLine("First approach (" + json["users"].Type + "):"); 
     Console.WriteLine(); 
     Console.WriteLine(json.ToString(Formatting.Indented)); 

     Console.WriteLine(); 
     Console.WriteLine(new string('-', 30)); 
     Console.WriteLine(); 

     json["users"] = new JValue(JsonConvert.SerializeObject(list)); 
     Console.WriteLine("Second approach (" + json["users"].Type + "):"); 
     Console.WriteLine(); 
     Console.WriteLine(json.ToString(Formatting.Indented)); 
    } 

    class User 
    { 
     public int Id { get; set; } 
     public string Username { get; set; } 
    } 
} 

आउटपुट:

First approach (Array): 

{ 
    "users": [ 
    { 
     "Id": 1, 
     "Username": "john.smith" 
    }, 
    { 
     "Id": 5, 
     "Username": "steve.martin" 
    } 
    ] 
} 

------------------------------ 

Second approach (String): 

{ 
    "users": "[{\"Id\":1,\"Username\":\"john.smith\"},{\"Id\":5,\"Username\":\"steve.martin\"}]" 
} 
+1

काम किया! धन्यवाद – s0nica

+0

धन्यवाद। यह वही था जो मैंने पूरे दिन बिताए जाने की कोशिश की थी। – Trebor

+0

सही, यह उत्तर के रूप में क्यों चिह्नित नहीं है? – killernerd

0

मैं था इस मुद्दे, अब आप अगर आप सिर्फ चाहते हैं तो इस करवाने के लिए, JArray उपयोग कर सकते हैं बिना रूट नाम वाले सरणी आइटम।

var json = JArray.FromObject(LoadUsers()); 

आप json सरणी की जड़ नाम चाहते हैं "उन" होने के लिए, आप उपयोग कर सकते मेरे लिए

var json = new JObject { ["users"] = JToken.FromObject(LoadUsers()) }; 
संबंधित मुद्दे