2013-02-05 15 views
7

मैं कुछ JSON डेटा जो इस तरह दिखता है के साथ JSON.NET में JSON के माध्यम से पार्स:अज्ञात संपत्ति के नाम

{ 
    "response":{ 
    "_token":"StringValue", 
    "code":"OK", 
    "user":{ 
    "userid":"2630944", 
    "firstname":"John", 
    "lastname":"Doe", 
    "reference":"999999999", 
    "guid":"StringValue", 
    "domainid":"99999", 
    "username":"jdoe", 
    "email":"[email protected]", 
    "passwordquestion":"", 
    "flags":"0", 
    "lastlogindate":"2013-02-05T17:54:06.31Z", 
    "creationdate":"2011-04-15T14:40:07.22Z", 
    "version":"3753", 
    "data":{ 
     "aliasname":{ 
     "$value":"John Doe" 
     }, 
     "smsaddress":{ 
     "$value":"[email protected]" 
     }, 
     "blti":{ 
     "hideemail":"false", 
     "hidefullname":"false" 
     }, 
     "notify":{ 
     "grades":{ 
      "$value":"0" 
      }, 
      "messages":{ 
      "$value":"1" 
      } 
     }, 
     "beta_component_courseplanexpress_1":{ 
     "$value":"true" 
     } 
    } 
    } 
} 

मैं JSON.NET साथ सी # का उपयोग कर रहा डेटा के माध्यम से पार्स करने के लिए। मैं सफलतापूर्वक इस कलन विधि का उपयोग डेटा प्राप्त कर लिया है:

User MyUser = new User(); 
JToken data = JObject.Parse(json); 
MyUser.FirstName = (string) data.SelectToken("response.user.firstname"); 
//The same for all the other properties. 

समस्या data क्षेत्र के साथ है। यह फ़ील्ड ज्यादातर उपयोगकर्ता प्राथमिकताओं पर आधारित है और डेटा का उपयोग केवल तभी किया जाता है जब इसका उपयोग किया जाता है। खेत सभी कस्टम हैं और डेवलपर्स जितना चाहें उतने प्रतिबंध लगा सकते हैं। अनिवार्य रूप से, यह सभी मुफ्त फॉर्म डेटा है। साथ ही आप ध्यान देते हैं कि उन्हें डेटा के साथ वास्तव में घोंसला जा सकता है।

MyUser.Data = JsonConvert.DeserializeObject<List<JToken>>((string) data.SelectToken("response.user.data"); 

जो काम नहीं करता:

मैं चलाने के लिए कोशिश की है।

सी # ऑब्जेक्ट में इसका उपयोग करने के लिए आप इसे कैसे परिवर्तित करेंगे?

+0

@KenKin वर्तमान में मैं डेटा स्टोर करने के लिए एक शब्दकोश देख रहा हूं। अन्य सदस्य चर केवल स्ट्रिंग गुण हैं जो MyUser.FirstName के माध्यम से एक्सेस करना वास्तव में आसान बनाते हैं। प्रश्न वास्तव में जेएसओएन के 'डेटा' हिस्से पर ध्यान केंद्रित करता है, शेष संदर्भ के लिए पूरी तरह से वहां है। – claydiffrient

उत्तर

11

आप JToken/JArray/JObject विधियों के माध्यम से पहुँच सकते हैं। उदाहरण के लिए, यह डेटा के नीचे सभी कुंजी सूचीबद्ध करेगा:

public class StackOverflow_14714085 
{ 
    const string JSON = @"{ 
          ""response"": { 
          ""_token"": ""StringValue"", 
          ""code"": ""OK"", 
          ""user"": { 
           ""userid"": ""2630944"", 
           ""firstname"": ""John"", 
           ""lastname"": ""Doe"", 
           ""reference"": ""999999999"", 
           ""guid"": ""StringValue"", 
           ""domainid"": ""99999"", 
           ""username"": ""jdoe"", 
           ""email"": ""[email protected]"", 
           ""passwordquestion"": """", 
           ""flags"": ""0"", 
           ""lastlogindate"": ""2013-02-05T17:54:06.31Z"", 
           ""creationdate"": ""2011-04-15T14:40:07.22Z"", 
           ""version"": ""3753"", 
           ""data"": { 
           ""aliasname"": { 
            ""$value"": ""John Doe"" 
           }, 
           ""smsaddress"": { 
            ""$value"": ""[email protected]"" 
           }, 
           ""blti"": { 
            ""hideemail"": ""false"", 
            ""hidefullname"": ""false"" 
           }, 
           ""notify"": { 
            ""grades"": { 
            ""$value"": ""0"" 
            }, 
            ""messages"": { 
            ""$value"": ""1"" 
            } 
           }, 
           ""beta_component_courseplanexpress_1"": { 
            ""$value"": ""true"" 
           } 
           } 
          } 
          } 
         }"; 

    public static void Test() 
    { 
     var jo = JObject.Parse(JSON); 
     var data = (JObject)jo["response"]["user"]["data"]; 
     foreach (var item in data) 
     { 
      Console.WriteLine("{0}: {1}", item.Key, item.Value); 
     } 
    } 
} 
+0

अभी तक यह तरीका मैं जो करने की कोशिश कर रहा हूं उसके साथ सबसे अधिक इनलाइन दिखता है। मैं इसे उत्तर के रूप में स्वीकार करने से पहले इसे थोड़ा सा खोलने जा रहा हूं। – claydiffrient

10

जेसन.NET वास्तव में गतिशील को पार्स कर सकता है यदि यह आपके लिए उपयोगी है। जिसका अर्थ है कि आप कुछ ऐसा कर सकते हैं।

dynamic parsedObject = JsonConvert.DeserializeObject("{ test: \"text-value\" }"); 

parsedObject["test"]; // "text-value" 
parsedObject.test; // "text-value" 
parsedObject.notHere; // null 

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

dynamic parsedObject = JsonConvert.DeserializeObject("{ test: { inner: \"text-value\" } }"); 
foreach (dynamic entry in parsedObject) 
{ 
    string name = entry.Name; // "test" 
    dynamic value = entry.Value; // { inner: "text-value" } 
} 
संबंधित मुद्दे