【问题标题】:Can't access C# object properties returned from WebClient.UploadValues()无法访问从 WebClient.UploadValues() 返回的 C# 对象属性
【发布时间】:2021-01-13 21:17:13
【问题描述】:

向 Web API 发送 WebClient() 请求,我的 API 调用返回的数据是我正在使用 JsonConvert.DeserializeObject() 反序列化的数据。

然后该对象具有我似乎无法引用的属性。

var coursesParams = new NameValueCollection();

coursesParams.Add("grant_type", "password");
coursesParams.Add("client_id", "ContentUpload");
coursesParams.Add("client_secret", "2dfe381b4e620fff9b4fa05997e26d141d9c2c6d");
coursesParams.Add("username", "isadmin");
coursesParams.Add("password", "xxxxxxxxx");

WebClient coursesRequest = new WebClient();

coursesRequest.Encoding = Encoding.UTF8;
coursesRequest.Headers.Add("Authorization", "Bearer " + x.access_token);
coursesRequest.Headers.Add("Content-Type", "application/x-www-form-urlencoded");
coursesRequest.Headers.Add("Accept-Language", "en-US");
coursesRequest.Headers.Add("Accept", "text/html, application/xhtml+xml, */*");
coursesRequest.Headers.Add("User-Agent", "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)");

var coursesData = coursesRequest.UploadValues("https://xxx.yyyyyyyyyy.com/api/course/courses", "POST", coursesParams);

var y = JsonConvert.DeserializeObject(Encoding.ASCII.GetString(coursesData));

System.Console.ReadKey();

当我暂停程序并在调试器中检查y 对象时,它会显示属性,但我无法引用它们中的任何一个。屏幕图片:

而且,任何引用(或读取)这些属性的尝试都会导致错误:

y.ChildrenTokens
error CS1061: 'object' does not contain a definition for 'ChildrenTokens' and no accessible extension method 'ChildrenTokens' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)
y.Count
error CS1061: 'object' does not contain a definition for 'Count' and no accessible extension method 'Count' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)

我在做什么(或看到)错了?这些属性根本无法访问吗?还是我引用错误?

【问题讨论】:

    标签: c# json webclient


    【解决方案1】:

    在 C# 中,您无法访问未在类型上定义的属性。您可以在调试器中看到属性,因为那是原始文本输入。但是由于您没有指定要反序列化的类型,DeserializeObject 方法只是创建普通的object 实例 - 而object 不包含任何属性(ChildrenTokens、Count 等)的定义。

    要解决此问题,您应该创建一个具有与您正在解析的 JSON 架构匹配的属性的类。这可能是一个好的开始:

    public class CourseData {
        public List<Course> courses { get; set; }
        public string item_count { get; set; }
        public bool success { get; set; }
    }
    public class Course {
        public int course_id { get; set; }
        public string code { get; set; }
        public string course_name { get; set; }
    }
    

    填写剩下的属性,然后像这样反序列化:

    // Option 1
    var y = JsonConvert.DeserializeObject<CourseData>(Encoding.ASCII.GetString(coursesData));
    
    // Option 2
    CourseData y = JsonConvert.DeserializeObject(Encoding.ASCII.GetString(coursesData));
    

    【讨论】:

    • 我还以为事情会这样发展。在其他情况下,我已经这样做了。但是,这个 JSON 本身包含多个对象,我不知道如何创建一个可以反序列化的类。 {{ "courses": [ {"course_id": 1, "code": "ORG HR"}, {"course_id": 2, "code": "ORG HR S"}, {"course_id": 3," code": "ORG GHS",}, {"course_id": 4,"code": "SAF"} ], "item_count": "72", "success": true }}
    • 抱歉,评论的格式不好,但是你可以看到json对象里面的重复组
    • @KirbyL.Wallace 这就是List&lt;Course&gt; courses 在我的示例中的用途。 JSON 反序列化器会将每个嵌套对象转换为Course,然后将它们全部存储在List 对象中。您可以通过courses[index] 访问它们。
    • 我确实找到了这个。它看起来完全像我需要做的。 stackoverflow.com/questions/38793151/…
    • @KirbyL.Wallace 这将起作用,但是该技术最好用于(至少在 C# 中)属性名称(“courses”、“course_id”等)可以更改的情况。在其他情况下,您应该定义类以便从静态类型中受益。编辑:“那个”指的是在链接线程的接受答案中使用IDictionary
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-06
    • 2014-03-10
    相关资源
    最近更新 更多