使用Json.net反序列化数据类型

时间:2017-02-28 23:22:26

标签: c# json.net

我想反序列化json

{ "variableName": "Current", "dataFormat": "FLOAT" }

并希望获得数据格式'直接作为变量的数据类型。

在这种情况下类似

public string VariableName {get; set;}
public float VariableValue {get; set;}
// or 
public boolean VariableValue {get;set;}
// or 
public object VariableValue {get; set;}

有任何建议或不可能吗?

1 个答案:

答案 0 :(得分:0)

您可以将Type Converter封装在VariableValue的getter中。 E.g。

void Main()
{
    const string json = @"    { 
        'variableName': 'Current',
        'dataFormat': 'System.Double',
        'dataValue' : '1.2e3' //scientific notation
    }";
    var v = JsonConvert.DeserializeObject<Variable>(json);

    Console.WriteLine($"Value={v.VariableValue}, Type={v.VariableValue.GetType().Name}");
    // Value=1200, Type=Double
    // Note that it converted the string "1.2e3" to a proper numerical value of 1200.
    // And recognises that VariableValue is a Double instead of our declared Object.
}

public class Variable
{
    // From JSON:
    public string VariableName { get; set; }
    public string DataFormat { get; set; }
    public string DataValue { get; set; }

    // Here be magic:
    public object VariableValue
    {
        get
        {
            /*  This assumes that 'DataFormat' is a valid .NET type like System.Double.
                Otherwise, you'll need to translate them first.
                E.g. "FLOAT" => "System.Single" 
                     "INT"   => "System.Int32", etc
            */
            var actualType = Type.GetType(DataFormat, true, true);
            return Convert.ChangeType(DataValue, actualType);
        }
    }
}

修改:用于从类型别名转换为框架类型(例如floatSystem.Single),this answer has a list of them