c# - 验证 JSON 序列化/反序列化为 c# double
问题描述
我怎样才能有一个验证 c# double 的模式?
c# double 可以是:“NaN”、“Infinity”、“-Infinity”。这在我们的系统中很重要,因为存在取决于这些值的逻辑。
JSON 序列化/反序列化完美运行。但我无法验证的是在下面的示例中,如果要反序列化的 JSON 包含一些无法转换为双精度的不同字符串。验证通过,然后它只会在反序列化中崩溃。
[TestMethod]
public void test3()
{
string json = @"{'A':'hello'}";
// validate
string myschemaJson = @"{
'description': 'An employee', 'type': 'object',
'properties':
{
'A': {'allOf':[{'type':'string','enum': ['NaN','Infinity','-Infinity']}, {'type':'number'}]}
}
}";
var schema = JsonSchema.Parse(myschemaJson);
JObject myObjJson = JObject.Parse(json);
// validation
bool isValid = myObjJson.IsValid(schema, out IList<string> errors);
isValid.Should().BeTrue(string.Join(",\n", errors.ToArray()));
// deserialize
var deserializeObject = JsonConvert.DeserializeObject<MySimpleObj>(json);
Console.WriteLine(deserializeObject.A);
}
public class MySimpleObj
{
public double A { get; set; }
}
解决方案
您可能希望有一个csharpDouble
(或类似的)定义,您可以在其中定义它可以是
- 一个数字,或
- 值之一
"NaN"
,"Infinity"
, 或"-Infinity"
首先,你需要
{ "type": "number" }
第二个,你想要
{ "enum": [ "NaN", "Infinity", "-Infinity" ] }
所以你的架构是
{
...
"definitions": { // or $defs for draft 2019-09
...
"csharpDouble": {
"oneOf": [
{ "type": "number" },
{ "enum": [ "NaN", "Infinity", "-Infinity" ] }
]
},
...
},
...
}
这将允许像
{ "myDouble": 5.24, "myOtherDouble": "NaN" }
其中myDouble
和myOtherDouble
都是受限于验证的属性#/definitions/csharpDouble
然后在您的反序列化器中,您可能需要提供自定义逻辑来将字符串值反序列化为double
类型上的适当静态字段。
推荐阅读
- c# - 我应该如何在视图中检查用户的角色?
- python - 如何在 pandas 的“n”个月分区上滚动数据
- swift - 设置图像以快速切换
- spring-boot - 例外:使用Spring`@DynamicPropertySource`时,只能在容器启动后获取映射端口
- python-3.x - (PySpark) StringIndexer Error: py4j.protocol.Py4JJavaError: An error occurred while calling o46.fit
- c# - UWP 使用 x:Bind 监控全局变量
- angular - 如果从根集合中存在,如何获取子集合数据
- python - 我是一个芹菜初学者,停留在非常基本的用法......甚至无法进入 task.delay()
- c# - 如何删除 Unity 项目的 Visual Studio 'IDE' 警告?
- r - 有什么方法可以在 R 中使用不同的 extract_table 函数吗?