gpt4 book ai didi

c# - 使用 JsonSerializer 有选择地读取部分 JSON 数据并填充一个 c# 对象

转载 作者:太空狗 更新时间:2023-10-29 23:13:45 24 4
gpt4 key购买 nike

我连接到第 3 方网络服务,该服务返回一个复杂的 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# 对象,并忽略所有其他内容?

最佳答案

如果你可以使用 Json.NET (Newtonsoft json),你可以像这样使用 Linq-to-Json [1]

//using Newtonsoft.Json.Linq;
var jsonString = File.ReadAllText(@"C:YourDirectory\file.json"); //source
var projects = new List<Project>(); //Your result

JObject data = JObject.Parse(jsonString);
foreach (var value in data["value"])
{
projects.Add(new Project
{
Id = value["Id"].ToString(),
Status = value["Status"].ToString(),
Title = value["Title"].ToString()
});
}

或者,您也可以像这样反序列化 JObject [2]

var jsonReader = data["value"].CreateReader();
projects = new JsonSerializer().Deserialize<List<Project>>(jsonReader);

两者都很好用,但哪个更好呢?

第二种方法意味着更少的代码(特别是,如果您在 Project 类中有很多属性,您将不得不编写很多行代码来映射代码 [1] 中的每个属性)。

但是第一种方法的性能要好很多倍!对于给定的 json 数据,代码 [1] 大约在 1 毫秒 内运行,而代码 [2] 需要超过 100 毫秒!


更新

James Newton-King(编写 Json.NET :) 的输入之后,还有另一种更优雅的方法 [3]

projects = data["value"].ToObject<List<Project>>();

你猜怎么着!此代码 [3] 花费了方法 [1] 的将近 一半 时间。所以,从各个角度来看,这一定是最好的方法!

关于c# - 使用 JsonSerializer 有选择地读取部分 JSON 数据并填充一个 c# 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32830963/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com