通过JSON中的JSON进行解析.NET具有未知属性名称

本文关键字:JSON 未知 属性 中的 通过 NET | 更新日期: 2023-09-27 17:58:03

我有一些JSON数据,看起来像这样:

{
   "response":{
   "_token":"StringValue",
   "code":"OK",
   "user":{
     "userid":"2630944",
     "firstname":"John",
     "lastname":"Doe",
     "reference":"999999999",
     "guid":"StringValue",
     "domainid":"99999",
     "username":"jdoe",
     "email":"jdoe@jdoe.edu",
     "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":"5555555555@messaging.sprintpcs.com"
       },
       "blti":{
         "hideemail":"false",
         "hidefullname":"false"
       },
       "notify":{
         "grades":{
            "$value":"0"
          },
          "messages":{
            "$value":"1"
          }
       },
       "beta_component_courseplanexpress_1":{
         "$value":"true"
       }
    }
  }
}

我使用的是带有JSON的C#。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#对象?

通过JSON中的JSON进行解析.NET具有未知属性名称

您可以通过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"": ""jdoe@jdoe.edu"",
                              ""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"": ""5555555555@messaging.sprintpcs.com""
                                },
                                ""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);
        }
    }
}

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