我得到用户输入,需要将其存储在JSON类型的数据库字段中。这可以是任何东西,也可以是任何事情,只要它是有效的JSON。在JSON.net中,有一种方法可以根据JSON方案验证JSON,但这太具体了。
现在,我必须对JSON字符串进行反序列化,并为此使用try-catch,我宁愿做一个简单的操作:
JsonTextReader rJSonReader = new JsonTextReader(new StringReader(@sCellValue));
if (rJSonReader.isValid()) {#more code here;}
我想这会干净得多。还是我错了?
我建议编写一个扩展方法,类似于int的TryParse。在内部执行try/catch,写入提供的变量,如果操作成功则返回。
您可以编写自己的Json语法验证器,但这似乎在一个并非真正问题的问题上花费了太多时间:)
这里有一个库,它封装了解析JSON对象的复杂性,同时允许您通过简单地读取NameValueCollection
来灵活地验证其属性。
对Deserialiser<T>
类进行子类化,并在实现中调用Deserialise()
返回的NameValueCollection
中的JSON属性中循环。通过确定集合中是否存在每个预期属性,您可以有效地引入自己的自定义验证:
class SimpleObjectDeserialiser : Deserialiser<SimpleObject> {
public SimpleObjectDeserialiser(SimpleJSONParser parser) : base(parser) {}
public override SimpleObject Deserialise() {
var properties = parser.Parse();
bool isValid;
var expectedProperties = new List<string> {"name", "age"};
if (expectedProperties.Any(expectedProperty => !properties.AllKeys.Contains(expectedProperty))) {
isValid = false;
}
else {
isValid = true;
}
if (isValid) {
return new SimpleObject
{
Name = properties.Get("name"),
Age = Convert.ToInt32(properties.Get("age"))
};
}
else {
throw new JSONValidationException();
}
}
}
利用这一点,您不必担心解析JSON对象,而是可以专注于验证结果。我很高兴详细介绍一下。