【发布时间】:2015-09-28 20:09:55
【问题描述】:
我连接到第 3 方 Web 服务,该服务返回一个复杂的 JSON 对象,该对象仅包含我实际需要的少量信息。
基本上,我只需要“值”中的数组。从那个数组中,我只需要“Id”、“Title”和“Status”属性。
我想将这些属性放入一个名为 Project 的 c# 类中。这是我的课:
public class Project
{
public String Id { get; set; }
public String Title { get; set; }
public String Status { get; set; }
}
我正在尝试使用此代码来读取 JSON 并进行转换:
using (WebResponse response = request.GetResponse())
{
using (StreamReader reader = new StreamReader(response.GetResponseStream()))
{
var serializer = new JsonSerializer();
var jsonTextReader = new JsonTextReader(reader);
returnValue = serializer.Deserialize<Project>(jsonTextReader);
}
}
示例 JSON:
{
"odata.metadata":"http://school.edu/Api/1/$metadata#Projects",
"odata.count":"3",
"value":[
{
"odata.id":"http://school.edu/Api/1/Projects('123')",
"RelatedProjects@odata.navigationLinkUrl":"http://school.edu/Api/1/Projects('123')/RelatedProjects",
"Tags@odata.navigationLinkUrl":"http://school.edu/Api/1/Projects('123')/Tags",
"TimedEvents@odata.navigationLinkUrl":"http://school.edu/Api/1/Projects('123')/Categories",
"ep@odata.navigationLinkUrl":"http://school.edu/Api/1/Projects('123')/ep",
"#CreateLike":{
"target":"http://school.edu/Api/1/Projects('123')/CreateLike"
},
"#CreateShortcut":{
"target":"http://school.edu/Api/1/Projects('123')/CreateShortcut"
},
"#Play":{
"target":"http://school.edu/Play/123"
},
"#SendInvitation":{
"target":"http://school.edu/Api/1/Projects('123')/SendInvitation"
},
"#CopyProject":{
"target":"http://school.edu/Api/1/Projects('123')/CopyProject"
},
"#AddVideoPodcast":{
"target":"http://school.edu/Api/1/Projects('123')/AddVideoPodcast"
},
"#AddEP":{
"target":"http://school.edu/Api/1/Projects('123')/AddEP"
},
"Id":"123",
"Title":"Test Title 1",
"Status":"Viewable"
},
{
"odata.id":"http://school.edu/Api/1/Projects('456')",
"RelatedProjects@odata.navigationLinkUrl":"http://school.edu/Api/1/Projects('456')/RelatedProjects",
"Tags@odata.navigationLinkUrl":"http://school.edu/Api/1/Projects('456')/Tags",
"TimedEvents@odata.navigationLinkUrl":"http://school.edu/Api/1/Projects('456')/Categories",
"ep@odata.navigationLinkUrl":"http://school.edu/Api/1/Projects('456')/ep",
"#CreateLike":{
"target":"http://school.edu/Api/1/Projects('456')/CreateLike"
},
"#CreateShortcut":{
"target":"http://school.edu/Api/1/Projects('456')/CreateShortcut"
},
"#Play":{
"target":"http://school.edu/Play/456"
},
"#SendInvitation":{
"target":"http://school.edu/Api/1/Projects('456')/SendInvitation"
},
"#CopyProject":{
"target":"http://school.edu/Api/1/Projects('456')/CopyProject"
},
"#AddVideoPodcast":{
"target":"http://school.edu/Api/1/Projects('456')/AddVideoPodcast"
},
"#AddEP":{
"target":"http://school.edu/Api/1/Projects('456')/AddEP"
},
"Id":"456",
"Title":"Test Title 2",
"Status":"Viewable"
},
{
"odata.id":"http://school.edu/Api/1/Projects('789')",
"RelatedProjects@odata.navigationLinkUrl":"http://school.edu/Api/1/Projects('789')/RelatedProjects",
"Tags@odata.navigationLinkUrl":"http://school.edu/Api/1/Projects('789')/Tags",
"TimedEvents@odata.navigationLinkUrl":"http://school.edu/Api/1/Projects('789')/Categories",
"ep@odata.navigationLinkUrl":"http://school.edu/Api/1/Projects('789')/ep",
"#CreateLike":{
"target":"http://school.edu/Api/1/Projects('789')/CreateLike"
},
"#CreateShortcut":{
"target":"http://school.edu/Api/1/Projects('789')/CreateShortcut"
},
"#Play":{
"target":"http://school.edu/Play/789"
},
"#SendInvitation":{
"target":"http://school.edu/Api/1/Projects('789')/SendInvitation"
},
"#CopyProject":{
"target":"http://school.edu/Api/1/Projects('789')/CopyProject"
},
"#AddVideoPodcast":{
"target":"http://school.edu/Api/1/Projects('789')/AddVideoPodcast"
},
"#AddEP":{
"target":"http://school.edu/Api/1/Projects('789')/AddEP"
},
"Id":"789",
"Title":"Test Title 3",
"Status":"Viewable"
}
],
"odata.nextLink":"http://school.edu/Api/1/Folders('xyz')/Projects?$skip=10&$top=10"
}
我只是得到一个空对象。但在调试器中,我可以看到它正在从 web 服务中提取所有 JSON 数据。
如何从 JSON 中获取我需要的内容,构建我的 c# 对象,而忽略其他所有内容?
【问题讨论】:
-
查看了反序列化文档后,似乎没有此功能的固有功能。因此,为了花时间等待答案,你能不反序列化整个事情,然后选择性地使用你需要的属性吗?
-
@m.edmondson 谢谢。愚蠢的问题,但如果没有反序列化,我将如何获得我需要的数据/属性?
-
你不能反序列化整个响应吗?
-
当我执行以下操作时,我可以在调试器中看到它: var rawJson = new StreamReader(response.GetResponseStream()).ReadToEnd();这给了我一个巨大的 JSON 字符串。