在反序列化期间或之后验证和更正JSON数据

时间:2015-02-18 17:10:58

标签: c# json validation

我几天来一直在为这个问题而烦恼,没有希望了。我还处于学习C#的早期阶段,所以如果我的解释或理解不足,请原谅。

我的方案是我需要访问API并将数据下载为JSON,然后将其反序列化为类。目前,工作正常,但每个变量都定义为String,这意味着我需要不断转换和操作应该是int / double的数据,因为API可以提供" N / A&#34 ;对于这些数据。我得到的印象是依赖于一切都是字符串是不好的做法。

那我应该怎么实现呢?我需要能够将数据存储为正确的类型,同时请记住它可能是错误的。

类型错误的属性示例

public string Title { get; set; }
public string Year { get; set; } // Wanted int. Often has an end year "2010-2014"
public string Metascore { get; set; } // Wanted double. Could be "N/A"

我能想象解决这个问题的唯一方法就是有两个类:第一个是原始的字符串类,然后第二个类是一个几乎相同的类,它具有使用原始数据的所需属性然后转换它

我的问题是该类已经有几十个属性,因此复制它似乎几乎和原始问题一样浪费。无论如何,我想知道未来使用的替代方案。

编辑: 发现了一个类似的问题here,但遗憾的是它并没有帮助。

1 个答案:

答案 0 :(得分:1)

你可以将json反序列化为JObject,然后加载你的自己

public class RootObject
    {
        public RootObject(JObject obj)
        {
            Title = obj["Title"].ToString();
            var year = obj["year"].ToString();
            Year = year == "N/A" ? 0 : int.Parse(year);
            var metascore = obj["Metascore"].ToString();
            Metascore = metascore == "N/A" ? 0 : int.Parse(metascore);
        }

        public string Title { get; set; }
        public int Year { get; set; } 
        public double Metascore { get; set; } 
    }

    static void Main(string[] args)
    {
        string json = "{\"Title\":\"test\",\"year\":\"2012\",\"Metascore\":\"N/A\"}";
        RootObject root = new RootObject(JObject.Parse(json));
    }