我错过了JSON.net中的一个简单验证检查



我得到用户输入,需要将其存储在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对象,而是可以专注于验证结果。我很高兴详细介绍一下。

相关内容

  • 没有找到相关文章

最新更新