在反序列化期间或之后验证和更正 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));
}
这几天我一直在为这个问题苦恼,没有希望了。我还处于学习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));
}