将json属性反序列化为bool或double
本文关键字:bool double 反序列化 json 属性 | 更新日期: 2023-09-27 18:05:55
我有以下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
,否则为双精度值。但在set方法中从未进入else
。
是否有其他方法来解决这种情况?
处理此问题的一种方法是将reduced_rate_alt
定义为字符串,然后定义一个新属性,该属性读取并尝试将其解析为getter中的值。这可以工作,但你有几个这样的,因为使用JSON。. NET,相同的转换器应该与所有它们一起工作,我将手动转换这些属性:
[JsonConverter(typeof(RateJsonConverter))]
public decimal reduced_rate_alt { get; set; }
用该属性装饰每个可能返回false的属性。这告诉JSON.NET
,您正在提供反序列化该属性的代码。在此过程中,您可能还需要使用[JsonProperty]
来修复属性名称。
规则/转换实现的是简单地为false
使用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<VRates>(jstr).rates;
foreach (KeyValuePair<string, VRate> 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中列出的比率