将json属性反序列化为bool或double

我有以下json:

"rates": { "AT": { "country": "Austria", "standard_rate": 20.00, "reduced_rate": 10.00, "reduced_rate_alt": 13.00, "super_reduced_rate": false, "parking_rate": 12.00 }, "DK": { "country": "Denmark", "standard_rate": 25.00, "reduced_rate": false, "reduced_rate_alt": false, "super_reduced_rate": false, "parking_rate": false }, } 

我有以下类来反序列化json:

  public string country { get; set; } public double standard_rate { get; set; } //public string reduced_rate { get; set; } private double _reduced_rate; public double reduced_rate { get { return _reduced_rate; } set { bool isDouble = Double.TryParse(value.ToString(), out _reduced_rate); if (isDouble) _reduced_rate = value; else _reduced_rate = 0.0; } } public string reduced_rate_alt { get; set; } public string super_reduced_rate { get; set; } public string parking_rate { get; set; } 

reduce_rate值为false我想设置一个0.0 else的double值。 但是在set方法中永远不会进入else

还有另一种解决这种情况的方法吗?

处理此问题的一种方法是将reduced_rate_alt定义为字符串,然后定义一个新属性,该属性读取并尝试将其解析为getter中的值。 这可以工作,但你有几个这样的,因为使用JSON.NET,相同的转换器应该适用于所有这些,我手动转换这些属性:

 [JsonConverter(typeof(RateJsonConverter))] public decimal reduced_rate_alt { get; set; } 

装饰可能使用该属性返回false的每个属性。 这告诉JSON.NET您要提供反序列化此属性的代码。 当你在它时,你可能还想用[JsonProperty]修复属性名称。

规则/转换实现只是使用0表示否则为值。 只要所有转换规则相同,您就可以为每个属性使用相同的转换器。 我还将类型更改为十进制,这可能更适合这些。

 public class RateJsonConverter : JsonConverter { public override bool CanConvert(Type objectType) { // name used in a previous answer return (objectType == typeof(VRate)); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { var token = JToken.Load(reader); decimal d = 0M; Decimal.TryParse(token.ToString(), out d); return d; } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); } } 

测试:

 var rates = JsonConvert.DeserializeObject(jstr).rates; foreach (KeyValuePair kvp in rates) { Console.WriteLine("key: {0} ({1}), reduced alt rate: {2}", kvp.Key, kvp.Value.country, kvp.Value.reduced_rate_alt.ToString("F2")); kvp.Value.VTag = kvp.Key; } 

前几个的输出:

关键:AT(奥地利),降低的最低比率:13.00
关键:BE(比利时),降低的最高比率:6.00
关键:BG(保加利亚),降低的最低比率:0.00
关键:CY(塞浦路斯),降低的最高比率:5.00
关键:CZ(捷克共和国),降低的最高比率:10.00
关键:DK(丹麦),降低的替代率:0.00

BG和DK为false并转换为0,而其他的则具有JSON中列出的速率。