2013-02-05 80 views
7

我有一些JSON数据,看起来像这样:通过JSON在JSON.NET解析未知属性名称

{ 
    "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" 
     } 
    } 
    } 
} 

我使用C#与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"); 

不工作。

你会如何将它转换为用于C#对象?

+0

@KenKin目前我正在查看字典以存储数据。其他成员变量只是简单的字符串属性,这使得通过MyUser.FirstName访问变得非常简单。这个问题真的集中在JSON的'data'部分,其余部分纯粹是为了参考。 – 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

Json.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" } 
}