解析包含布尔,ushort,hex,int,浮点到ushort的字符串的优雅方法?

时间:2019-05-23 17:46:37

标签: c#

我有Dictionary<string, string>,其中的值可以包含十六进制,布尔值,ushort,float或int。我必须根据某些属性将它们解析为boolushort

我要从json文件中获取数据,并在需要时使用Newtonsoft将其解析为对象。

在没有if's的情况下,如何在没有大量TryParse()的情况下实现优雅的效果?

我有一些界面

interface SomeInterface {
    IEnumerable Data { get; set; }
}

class SomeClass : SomeInterface {
    public IDictionary<string, string> Data { get; set; }

    IEnumerable SomeInferface.Data 
    {
       get => Data;
       set => Data = (IDictionary<string, string>)value;
    }
}

example.json

{
   "someproperty": "",
   "data": {
      "2938": "0x60" // can be "true", "3.14", "250"
   }
}

这和往常一样被解析

return JsonConvert.DeserializeObject<IList<T>>(json, new JsonSerializerSettings
        {
            Error = OnDeserializationError
        });

在我的情况下,TSomeClass

1 个答案:

答案 0 :(得分:0)

我认为没有一种优雅的方法,只需考虑所有可能的情况即可。

对于布尔和十六进制

if(str.Length >= 2)
{
    switch(str[1])
    {
        case 'r'
            if(str == "true")
               //true
        case 'a'
            //false
        case 'x'
            //hex
    }
}

其他数字

var d = double.Parse(str);
var i = (int)d;

if(d != i)
    //float
else if (i >= 0 && i <= ushort.MaxValue)
    //ushort
else
    //int