JSONObject反序列化不会反序列化

时间:2018-08-29 19:00:04

标签: c# json restsharp json-deserialization

这让我感到难过。这是我简化的C#类定义:

public class Countries
{
    string TotalCount { get; set; }
    public List<Ctry> Country { get; set; }
}
public class Ctry
{
    string CountryId { get; set; }
    string CountryName { get; set; }
}

我进行的REST调用成功,并返回以下可以在'content'变量中看到的JSON:

{"TotalCount":1,"Country":[{"CountryId":1,"CountryName":"USA"}]}

这是我的c#反序列化代码:

var content = response.Content;
countryList =  JsonConvert.DeserializeObject<Countries>(content);

反序列化后,我希望国家/地区数据位于countryList对象中。但是在countryList中没有数据显示!是什么赋予了?也没有例外或错误!

1 个答案:

答案 0 :(得分:0)

您的问题是JSON.NET默认为驼峰式属性名称。默认情况下,这就是您的代码正在寻找的内容:

{"country":[{"countryId":"1","countryName":"USA"}]}

您需要为模型手动声明JSON.NET属性名称:

public class Countries
{
    [JsonProperty(PropertyName = "TotalCount")]
    string TotalCount { get; set; }

    [JsonProperty(PropertyName = "Country")]
    public List<Ctry> Country { get; set; }
}
public class Ctry
{
    [JsonProperty(PropertyName = "CountryId")]
    string CountryId { get; set; }

    [JsonProperty(PropertyName = "CountryName")]
    string CountryName { get; set; }
}

我对此进行了测试,并且可以处理您的数据。

作为一个旁注,我声明了所有属性名称,因为我希望保持对序列化和反序列化的手动控制,在您的情况下,您可以仅声明多大小写的单词来尖叫。

如果您不想手动定义属性名称,也可以通过调整属性的保护级别来解决此问题:

public class Countries
{
    public string TotalCount { get; set; }
    public List<Ctry> Country { get; set; }
}
public class Ctry
{
    public string CountryId { get; set; }
    public string CountryName { get; set; }
}

通过这种方式,如果JSON.NET是可以公开访问的,则它们可以自动匹配属性名称。

@Tom W-JSON.NET将在可能的情况下自动转换类型,将int转换为string并将string转换为int都可以。