无法访问从 WebClient.UploadValues() 返回的 C# 对象属性
Can't access C# object properties returned from WebClient.UploadValues()
向 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# 中,您无法访问未在类型上定义的属性。您可以在调试器中看到属性,因为那是原始文本输入。但是由于您没有指定要反序列化的类型,DeserializeObject
方法只是创建普通的 object
实例 - 而 object
不包含任何属性的定义(ChildrenTokens、Count、等)。
要解决此问题,您应该创建一个 class,其属性与您正在解析的 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));
向 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# 中,您无法访问未在类型上定义的属性。您可以在调试器中看到属性,因为那是原始文本输入。但是由于您没有指定要反序列化的类型,DeserializeObject
方法只是创建普通的 object
实例 - 而 object
不包含任何属性的定义(ChildrenTokens、Count、等)。
要解决此问题,您应该创建一个 class,其属性与您正在解析的 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));