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

Validating and Correcting JSON data during or after deserialization

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

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

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

类型错误的属性示例

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"

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

我的问题是 class 已经有几十个属性,所以复制它似乎几乎和原来的问题一样浪费。无论如何,我想知道一个替代方案以供将来使用。

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

您可以将 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));
    }