C# 我可以从JSON反序列化特定字段吗?
我正在编写一个方法,该方法采用英国邮政编码,并将该邮政编码的纬度和经度作为“位置”对象返回 我使用的API从中获取一个邮政编码并返回一组相当大的数据。例如(白金汉宫,如果您感兴趣): 目前,我已经将其设置为通过使用VisualStudio的“Paste Special>Paste JSON as classes”功能为数据生成类,然后使用JSON.Net对整个数据集进行反序列化,然后使用结果对象中的纬度和经度创建新的Location对象来获取数据C# 我可以从JSON反序列化特定字段吗?,c#,.net,json,json.net,C#,.net,Json,Json.net,我正在编写一个方法,该方法采用英国邮政编码,并将该邮政编码的纬度和经度作为“位置”对象返回 我使用的API从中获取一个邮政编码并返回一组相当大的数据。例如(白金汉宫,如果您感兴趣): 目前,我已经将其设置为通过使用VisualStudio的“Paste Special>Paste JSON as classes”功能为数据生成类,然后使用JSON.Net对整个数据集进行反序列化,然后使用结果对象中的纬度和经度创建新的Location对象来获取数据 public class Location {
public class Location
{
public double Longitude;
public double Latitude;
}
Rootobject locationData = JsonConvert.DeserializeObject<Rootobject>(content);
Location locationToReturn = new Location()
{
Latitude = locationData.result.latitude,
Longitude = locationData.result.longitude
};
Rootobject locationData=JsonConvert.DeserializeObject(内容);
位置locationToReturn=新位置()
{
纬度=locationData.result.Latitude,
经度=locationData.result.Longitude
};
在我看来,当我只想要两个字段时,我不得不经历反序列化整个事情的努力,这似乎很愚蠢
因此,问题是:
我可以只反序列化纬度和经度字段吗
更具体地说,对于我的示例,我是否可以将纬度和经度字段直接反序列化到我的Location类的新实例中?您可以使用Newtonsoft.Json(Json.Net)自己遍历Json对象,只获取所需的值 您可能希望使用JObject来捕获整个结果。转到
结果的子标记
,然后获取经度和纬度的子项,并根据需要进行反序列化
您也可以查看此答案您可以将数据加载到动态对象中。 然后从那里读
dynamic locationData = JsonConvert.DeserializeObject<dynamic>(content);
Location locationToReturn = new Location()
{
Latitude = locationData.result.latitude,
Longitude = locationData.result.longitude
};
Console.WriteLine("Latitude: " + locationToReturn.Latitude);
Console.WriteLine("Longitude: " + locationToReturn.Longitude);
Console.ReadLine();
DynamicLocationData=JsonConvert.DeserializeObject(内容);
位置locationToReturn=新位置()
{
纬度=locationData.result.Latitude,
经度=locationData.result.Longitude
};
控制台写入线(“纬度:+locationToReturn.Latitude”);
Console.WriteLine(“经度:+locationToReturn.Longitude”);
Console.ReadLine();
通过这种方式,您还可以获得其他列或值,而不必枚举所有字段。您可以使用如下方法:
Location locationData = JObject.Parse(content)["result"].ToObject<Location>();
然后你可以这样做:
Location locationData = JsonConvert.DeserializeObject<Rootobject>(content).Location;
Location locationData=JsonConvert.DeserializeObject(content.Location);
Fiddle:如果这个问题已经得到回答,我很抱歉,但我找不到任何我认为与我的情况完全匹配的东西。请查看动态对象的愿望化。你可以这样使用它。你关心性能吗?我还没有对此进行测试,但我很确定反序列化20个字段的额外开销并不比反序列化2个字段多多少。Newtonsoft.js反序列化对象。使用Newtonsoft反序列化json是一个将某些字符串转换为JObject类的过程。之后,它会尝试将此JObject映射到您的自定义类型。因此,一种方法是直接使用JObject并动态访问其属性,但请记住,首先它将对整个json进行反序列化,这样性能增益将是最小的…@Fabjan谢谢,这有助于我更好地理解它。我只是想寻找一种减少非载波代码的方法,而不是任何性能提升。但是这个建议改变了我对一个好用例的想法!非常感谢。
class Rootobject
{
[JsonProperty("result")]
public Location Location { get; set; }
}
Location locationData = JsonConvert.DeserializeObject<Rootobject>(content).Location;