C# 我可以从JSON反序列化特定字段吗?

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 {

我正在编写一个方法,该方法采用英国邮政编码,并将该邮政编码的纬度和经度作为“位置”对象返回

我使用的API从中获取一个邮政编码并返回一组相当大的数据。例如(白金汉宫,如果您感兴趣):

目前,我已经将其设置为通过使用VisualStudio的“Paste Special>Paste JSON as classes”功能为数据生成类,然后使用JSON.Net对整个数据集进行反序列化,然后使用结果对象中的纬度和经度创建新的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;