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

时间:2018-01-17 15:43:47

标签: c# .net json json.net

我正在编写一种方法,该方法采用英国邮政编码并将此邮政编码的纬度和经度作为"位置"对象

public class Location
{
    public double Longitude;
    public double Latitude;
}

我正在使用来自https://postcodes.io/的API,它采用邮政编码并返回相当大的数据集。例如(白金汉宫,如果你感兴趣的话):

{
"status": 200,
"result": {
    "postcode": "SW1A 1AA",
    "quality": 1,
    "eastings": 529090,
    "northings": 179645,
    "country": "England",
    "nhs_ha": "London",
    "longitude": -0.141587597876975,
    "latitude": 51.5010091564599,
    "european_electoral_region": "London",
    "primary_care_trust": "Westminster",
    "region": "London",
    "lsoa": "Westminster 018C",
    "msoa": "Westminster 018",
    "incode": "1AA",
    "outcode": "SW1A",
    "parliamentary_constituency": "Cities of London and Westminster",
    "admin_district": "Westminster",
    "parish": "Westminster, unparished area",
    "admin_county": null,
    "admin_ward": "St James's",
    "ccg": "NHS Central London (Westminster)",
    "nuts": "Westminster",
    "codes": {
        "admin_district": "E09000033",
        "admin_county": "E99999999",
        "admin_ward": "E05000644",
        "parish": "E43000236",
        "parliamentary_constituency": "E14000639",
        "ccg": "E38000031",
        "nuts": "UKI32"
        }
    }
}

目前我已将其设置为通过使用Visual Studio" Paste Special>生成数据类来获取数据。将JSON粘贴为类"功能,然后使用JSON.Net反序列化整个数据集,然后使用结果对象的纬度和经度创建一个新的Location对象。

Rootobject locationData = JsonConvert.DeserializeObject<Rootobject>(content);

        Location locationToReturn = new Location()
        {
            Latitude = locationData.result.latitude,
            Longitude = locationData.result.longitude
        };

当我只想要两个字段时,我必须完成反序列化整个事情的工作,这对我来说似乎很愚蠢。

所以问题是:

我可以只反序列化纬度和经度字段吗?

更具体地说,我可以将纬度和经度字段直接反序列化为我的Location类的新实例吗?

3 个答案:

答案 0 :(得分:1)

您可以将数据加载到动态对象中。 然后从那里阅读。

        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();

通过这种方式,您可以获取其他列或值,而无需枚举所有字段。

答案 1 :(得分:1)

你可以使用这样的JObject做你想做的事:

Location locationData = JObject.Parse(content)["result"].ToObject<Location>();

小提琴:https://dotnetfiddle.net/vWwLUf

或者只是更改Rootobject类的类定义:

class Rootobject
{
    [JsonProperty("result")]
    public Location Location { get; set; }
}

然后你可以这样做:

Location locationData = JsonConvert.DeserializeObject<Rootobject>(content).Location;

小提琴:https://dotnetfiddle.net/imng8Q

答案 2 :(得分:0)

你可以使用Newtonsoft.Json(Json.Net)自己遍历json对象,只获取你需要的值。

您可能希望使用JObject来捕获整个结果。转到result的子令牌,然后获取经度和纬度的子项,并根据需要进行反序列化。

您也可以查看此答案How do I enumerate through a JObject?