Json.Net反序列化数字值的“NA”

时间:2016-05-01 21:35:06

标签: c# json json.net deserialization numeric

我正在尝试使用Json.Net对数字数据进行反序列化,如果缺少值,则可以将值指定为“NA”,例如。

{
    "readings": [
        { "temperature" : 75 } ,
        { "temperature" : "NA" }
    ]
}

我想将值解析为 double?类型,例如

public class Reading
{
    public double? Temperature { get; set; }
}

其中(净效应)我的例子中的第一个读数是“75”而第二个读数是“空”。

我无法控制提供给我的JSON。

JsonConverter是让Json.Net为我处理这个问题的唯一方法,还是有一些更简单的方法? (我总是可以为Json反序列化值创建一个私有类变量,然后添加我自己的公共属性,对私有值执行任何我想做的事情,但因为我有很多属性要处理它会有很多额外的代码。)

5 个答案:

答案 0 :(得分:0)

在您的服务器代码中,将温度设为模型中的字符串,然后使用TryParse查看它是否可以转换为double。

double tempValue;

if (Double.TryParse(yourObject.Temperature, out temp)){
  // successfully parsed to a double
  // do whatever you're going to do with the value
}
else {
  // couldn't be parsed as a double, handle accordingly
}

https://msdn.microsoft.com/en-us/library/994c0zb1(v=vs.110).aspx

答案 1 :(得分:0)

我认为没有办法让反序列化器将字符串转换为可以为空的double。最好将值反序列化为字符串,然后在使用时将字符串转换为数值。

所以你可以尝试这样的事情:

 public class Reading
{
public string Temperature {get; set;}
private double? _NumTemperature;
public Double? NumTemperature{
get{ return _NumTemperature} 
set{
Double n;
bool isNumeric = double.TryParse(Temperature, out n);
if (isNumeric)
{
_NumTemperature = n;
}
else
{
_NumTemperature = null;
}
}}
}

答案 2 :(得分:0)

我建议构建一个自定义类型转换器,但如果确实不想这样做,则可以implement an error handler忽略反序列化异常。假设您有这样的设置:

S.empty

你可以这样写:

public class Reading
{
    public double? Temperature { get; set; }
}

public class Root
{
    public List<Reading> Readings { get; set; }
}

如果我们在反序列化Root obj = JsonConvert.DeserializeObject<Root>( json, new JsonSerializerSettings { Error = (sender, args) => { Reading reading = args.CurrentObject as Reading; if (reading != null && args.ErrorContext.Member.ToString() == "temperature") { reading.Temperature = null; args.ErrorContext.Handled = true; } } }); 成员时检测到错误,我们正在处理Error事件并标记处理的错误。

万一你想使用自定义转换器,这就是它的样子:

temperature

答案 3 :(得分:0)

Json.NET允许您create JsonConverter subclasses处理特殊情况;您覆盖一些方法并将其传递给JsonConvert.Deserialise*方法

所以你的步骤是创建一个类似于这样的类;

public NAConverter: JsonConverter
{
    public override bool CanConvert(Type t) { return t == typeof(string); }
    public override ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        ...
    }
}

然后,在ReadJson中,您可以向JsonReader询问它是否指向一个字符串,以及是否&#34; NA&#34;。如果是,则返回null或零或Double.IsNaN;否则,顺从基地。

然后将实例传递给JsonConvert.DeserializeObject()JsonConvert.Deserialize<T>()

答案 4 :(得分:0)

您可以按照以下方式修改您的课程,并使用Newtonsoft Json library进行序列化/反序列化:

public class Reading
{
    [JsonIgnore]
    public double? Temperature { get; set; }

    [JsonProperty("temperature")]
    private string TemperatureString 
    {
        get
        {
            return Temperature.HasValue ? Temperature.Value.ToString() :"NA";
        }
        set
        {
            double result;
            Temperature = double.TryParse(value, out result) ? result : null;
        }
    }
}