欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Json Schema的使用

程序员文章站 2022-03-28 19:44:02
直接上案例: 在Web Api通讯中,客户端发送json数据,服务端反序列化json(json与某个类形成对应关系),在某些情况下,需要校验其上传的json是否合法。 服务端是使用Json.net(newtonsoft.json)进行反序列化。一般我们反序列化json为对象时代码如下: json原型 ......

直接上案例:

在Web Api通讯中,客户端发送json数据,服务端反序列化json(json与某个类形成对应关系),在某些情况下,需要校验其上传的json是否合法。

服务端是使用Json.net(newtonsoft.json)进行反序列化。一般我们反序列化json为对象时代码如下:

    class Program
    {
        static void Main(string[] args)
        {
            string str = "{\"Id\":1,\"Name\":\"张三\",\"Age\":20}";
            Person p = JsonConvert.DeserializeObject<Person>(str);
            Console.ReadKey();
        }
    }

    internal class Person
    {
        public int Id { get; set; }

        public string Name { get; set; }

        public int Age { get; set; }


    }

json原型是:

{
    "Id": 1,
    "Name": "张三",
    "Age": 20
}

通过调试,结果正确:

Json Schema的使用

 

 

 然而,下面这个json反序列化也正确

{
    "Id": 1,
    "Name": "张三",
    "Age": 20,
    "Height":170
}

Json Schema的使用

然而这并非我们想要的结果,需要限制不能有额外的key-value (键值对,下同),否则需要反序列化时抛出异常。 为了达到此目的,可以通过JsonSerializerSettings的MissingMemberHandling为MissingMemberHandling.Error:

string str = "{\"Id\":1,\"Name\":\"张三\",\"Age\":20,\"Height\":170}";
JsonSerializerSettings settings = new JsonSerializerSettings { MissingMemberHandling = MissingMemberHandling.Error };
Person p = JsonConvert.DeserializeObject<Person>(str,settings);
Console.ReadKey();

Json Schema的使用

 

上面是json中有多余key-value的情况下反序列化的让其失败,然后捕获异常进行后续的处理的方法。 但还有一种就是json中缺少某对key-value的情况下序列化的问题, 示例json如下:

{
    "Id": 1,
    "Name": "张三"
}

Json Schema的使用

从调试的结果看能正常反序列化,但Age为默认值0。 但在实际的过程中需要校验是否为完整的json(不能缺少某个key-value),如果不是完整的json,则不能反序列化,为了达到这个目地,此处使用newtonsoft.Json.Schema.

首先,安装并添加引用

Json Schema的使用

string str = "{\"Id\":1,\"Name\":\"张三\"}";
JSchema schema = new JSchemaGenerator().Generate(typeof(Person));
JToken token = JToken.Parse(str);
if (token.IsValid(schema))
{
    JsonSerializerSettings settings = new JsonSerializerSettings { MissingMemberHandling = MissingMemberHandling.Error };
    Person p = JsonConvert.DeserializeObject<Person>(str, settings);
}
else
{
    Console.WriteLine("不是完整的json");
}
Console.ReadKey();

Json Schema的使用

 

参考资料: