• Json Schema的使用


    直接上案例:

    在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反序列化也正确

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

    然而这并非我们想要的结果,需要限制不能有额外的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中有多余key-value的情况下反序列化的让其失败,然后捕获异常进行后续的处理的方法。 但还有一种就是json中缺少某对key-value的情况下序列化的问题, 示例json如下:

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

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

    参考资料:https://www.newtonsoft.com/jsonschema

  • 相关阅读:
    eclipse安装WTP部署WEB项目
    BZOJ3302: [Shoi2005]树的双中心
    BZOJ2059: [Usaco2010 Nov]Buying Feed 购买饲料
    BZOJ1986: [USACO2004 Dec] Dividing the Path 划区灌溉
    BZOJ3126: [Usaco2013 Open]Photo
    51nod1486 大大走格子
    BZOJ1698: [Usaco2007 Feb]Lilypad Pond 荷叶池塘
    BZOJ2590: [Usaco2012 Feb]Cow Coupons
    BZOJ1739: [Usaco2005 mar]Space Elevator 太空电梯
    BZOJ2501: [usaco2010 Oct]Soda Machine
  • 原文地址:https://www.cnblogs.com/godbell/p/9349442.html
Copyright © 2020-2023  润新知