当前位置: 首页 > 面试题库 >

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

高鸿振
2023-03-14
问题内容

我有一些看起来像这样的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.NET中使用C#来解析数据。我已经能够使用以下算法成功获取数据:

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#对象中使用?


问题答案:

您可以通过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);
        }
    }
}


 类似资料:
  • 问题内容: 这是我在jQuery中的响应代码: 每个都是形式。 我希望访问javascript中的这两个数据位,如果我事先不知道例如什么,该怎么做? 问题答案: 使用检索键名的完整列表(阵列)。一个polyfill 在这里可用。 您问题的回答格式仅包含一对键值对。然后可以将代码简化为: 如果你没有在列表中感兴趣的话,使用循环 使用 。必须使用最后一种方法,以排除从原型继承的属性。

  • 问题内容: 我正在使用JSON.NET,我想从XML转换为JSON。 我正在使用JsonConvert.SerializeXNode(node),我注意到我的json对象具有在其名称前面带有@的属性: 因此,例如:如果我有: JSON对象是: 为什么在JSON中插入“ @”,有什么方法可以避免插入“ @”字符? 问题答案: 我认为这就是json.net关于@符号的工作方式。您始终可以在json字符

  • 问题内容: 我有一个用swift编写的CustomViewController类和用Objective C编写的CustomNavigationController类。我试图将CustomNavigationController作为属性添加到我的CustomViewController中。我已经添加到我的桥接头中。 在我的CustomViewController中,我有: 在尝试构建并运行之前没有

  • 问题内容: 我正在从如下所示的Web API接收JSON数据: 我将此数据反序列化为以下类型的对象: 稍后在我的应用程序中,我想再次将ErrorDetails对象序列化为JSON,但使用属性名称代替。因此结果将如下所示: 有什么简单的方法可以使用Json.Net完成此操作?也许使用自定义解析器和一些属性,例如: 但是解析器不会告诉我何时进行序列化或反序列化。 问题答案: 您可以使用,Contrac

  • 问题内容: 我正在使用JSON.NET对对象进行序列化以连接到REST API。我对象中需要序列化为JSON的属性之一具有动态属性名称。如果此属性的struct中包含的值是数字值,则JSON属性为“ type_id”,但是,如果此值是字符串值,则JSON属性名称为“ type_code”。我尝试为此使用自定义,但是在尝试序列化时收到以下消息: “状态为Property的令牌PropertyName

  • 问题内容: 我正在使用JSON将一些值从外部源获取到变量中。 我有一个这样的类型,将值放入: 解组后,我可以通过以下方式访问类型: 但是如果我尝试做类似的事情: 编译器抱怨没有这样的值。 所以我的问题是,我如何根据某些条件引用我知道会存在的Go属性? 做到这一点: 但这不是很灵活,因为我将收到不同的。 问题答案: 会尽力将数据放置在最适合您的类型的位置。从技术上讲,您的第一个示例将起作用,但是即使