zoukankan      html  css  js  c++  java
  • Json.Net使用JSON Schema验证JSON格式【实例】

    给出一个Json,验证其格式是否符合规则。

    {
      "coord": {                                 //对象
        "lon": 145.77,
        "lat": -16.92
      },
      "sys": {                                  //对象
        "type": 1,
        "id": 8166,
        "message": 0.0402,
        "country": "AU",
        "sunrise": 1417116823,
        "sunset": 1417163764
      },
      "weather": [                                //数组(子项是对象)
        {
          "id": 801,
          "main": "Clouds",
          "description": "few clouds",
          "icon": "02d"
        },
        {
          "id": 801,
          "main": "Clouds",
          "description": "few clouds",
          "icon": "02d"
        }
      ],
      "base": "cmc stations",                          //字符串
      "main": {                                  //对象
        "temp": 304.15,                               //浮点型
        "pressure": 1012,                              //整形
        "humidity": 43,                               //整形
        "temp_min": 304.15,
        "temp_max": 304.15
      },
      "wind": {                                  //对象
        "speed": 5.7,
        "deg": 110
      },
      "clouds": {
        "all": 20
      },
      "dt": 1417134600,                              //整形
      "id": 2172797,                                //整形
      "name": "Cairns",                              //字符串
      "cod": 200                                  //整形
    }

    在前一篇文中我们知道JSON Schema可以通过加载字符串或者文件得到,可是新手一下子写出验证的字符串实在有点难度。

    还好,Json.Net里面可以在代码里创建JSON Schema,简直是手把手教学,显浅易懂。

    参见上一篇文中的代码里创建JSON Schema,我们将这个Json分拆为coord、sys、weather、base、main、wind、clouds、dt等等小的json,逐一创建对应的模式,最后组合在一起验证完整的Json。

                JsonSchema coordSchema = new JsonSchema();
                coordSchema.Type = JsonSchemaType.Object;
                coordSchema.Properties = new Dictionary<string, JsonSchema>
                {
                    { "lon", new JsonSchema { Type = JsonSchemaType.Float } },
                    { "lat", new JsonSchema { Type = JsonSchemaType.Float } }
                };
    
                JsonSchema sysSchema = new JsonSchema();
                sysSchema.Type = JsonSchemaType.Object;
                sysSchema.Properties = new Dictionary<string, JsonSchema>
                {
                    { "type", new JsonSchema { Type = JsonSchemaType.Integer } },
                    { "id", new JsonSchema { Type = JsonSchemaType.Integer } },
                    { "message", new JsonSchema { Type = JsonSchemaType.Float } },
                    { "country", new JsonSchema { Type = JsonSchemaType.String } },
                    { "sunrise", new JsonSchema { Type = JsonSchemaType.Integer } },
                    { "sunset", new JsonSchema { Type = JsonSchemaType.Integer } }
                };
    
                JsonSchema weatherItemSchema = new JsonSchema();
                weatherItemSchema.Type = JsonSchemaType.Object;
                weatherItemSchema.Properties = new Dictionary<string, JsonSchema>
                {
                    { "id", new JsonSchema { Type = JsonSchemaType.Integer } },
                    { "main", new JsonSchema { Type = JsonSchemaType.String } },
                    { "description", new JsonSchema { Type = JsonSchemaType.String } },
                    { "icon", new JsonSchema { Type = JsonSchemaType.String } }
                };
    
                JsonSchema windSchema = new JsonSchema();
                windSchema.Type = JsonSchemaType.Object;
                windSchema.Properties = new Dictionary<string, JsonSchema>
                {
                    { "speed", new JsonSchema { Type = JsonSchemaType.Float } },
                    { "deg", new JsonSchema { Type = JsonSchemaType.Integer } }
                };
    
                JsonSchema weatherSchema = new JsonSchema();
                weatherSchema.Type = JsonSchemaType.Array;
                weatherSchema.Items = new List<JsonSchema>();
                weatherSchema.Items.Add(weatherItemSchema);
            
    
                JsonSchema mainSchema = new JsonSchema();
                mainSchema.Type = JsonSchemaType.Object;
                mainSchema.Properties = new Dictionary<string, JsonSchema>
                {
                    { "temp", new JsonSchema { Type = JsonSchemaType.Float } },
                    { "pressure", new JsonSchema { Type = JsonSchemaType.Integer } },
                    { "humidity", new JsonSchema { Type = JsonSchemaType.Integer } },
                    { "temp_min", new JsonSchema { Type = JsonSchemaType.Float } },              
                    { "temp_max", new JsonSchema { Type = JsonSchemaType.Float } }
                };
    
                JsonSchema cloudsSchema = new JsonSchema();
                cloudsSchema.Type = JsonSchemaType.Object;
                cloudsSchema.Properties = new Dictionary<string, JsonSchema>
                {
                    { "all", new JsonSchema { Type = JsonSchemaType.Float } }
                };

    最后将这些分支的模式组合起来:

                JsonSchema schema = new JsonSchema();
                schema.Type = JsonSchemaType.Object;
                schema.Properties = new Dictionary<string, JsonSchema>
                {
                    {"coord", coordSchema },
                    {"sys", sysSchema },
                    {"weather",weatherSchema},
                    {"base", new JsonSchema{Type = JsonSchemaType.String} },
                    {"main",mainSchema},
                    {"wind",windSchema},
                    {"clouds",cloudsSchema},
                    {"dt", new JsonSchema{Type = JsonSchemaType.Integer} },
                    {"id", new JsonSchema{Type = JsonSchemaType.Integer} },
                    {"name", new JsonSchema{Type = JsonSchemaType.String} },
                    {"cod", new JsonSchema{Type = JsonSchemaType.Integer} }
                };
                bool valid = jobject.IsValid(schema);    

    也可以将最后的schema转化为字符串保存在专门的文件里,需要的时候从中读取:

    {
      "type": "object",
      "properties": {
        "coord": {
          "type": "object",
          "properties": {
            "lon": {
              "type": "number"
            },
            "lat": {
              "type": "number"
            }
          }
        },
        "sys": {
          "type": "object",
          "properties": {
            "type": {
              "type": "integer"
            },
            "id": {
              "type": "integer"
            },
            "message": {
              "type": "number"
            },
            "country": {
              "type": "string"
            },
            "sunrise": {
              "type": "integer"
            },
            "sunset": {
              "type": "integer"
            }
          }
        },
        "weather": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "id": {
                "type": "integer"
              },
              "main": {
                "type": "string"
              },
              "description": {
                "type": "string"
              },
              "icon": {
                "type": "string"
              }
            }
          }
        },
        "base": {
          "type": "string"
        },
        "main": {
          "type": "object",
          "properties": {
            "temp": {
              "type": "number"
            },
            "pressure": {
              "type": "integer"
            },
            "humidity": {
              "type": "integer"
            },
            "temp_min": {
              "type": "number"
            },
            "temp_max": {
              "type": "number"
            }
          }
        },
        "wind": {
          "type": "object",
          "properties": {
            "speed": {
              "type": "number"
            },
            "deg": {
              "type": "integer"
            }
          }
        },
        "clouds": {
          "type": "object",
          "properties": {
            "all": {
              "type": "number"
            }
          }
        },
        "dt": {
          "type": "integer"
        },
        "id": {
          "type": "integer"
        },
        "name": {
          "type": "string"
        },
        "cod": {
          "type": "integer"
        }
      }
    }

    验证说明:

    1、原Json字符串,正确;

    2、原Json的weather列表增加{"id": 801,"main": "Clouds","description": "few clouds","icon": "02d"},正确;

    3、原Json的id修改为haha,错误;

    4、原Json增加"planet":earth,错误,增加了额外的结构;

    5、原Json删除"id": 2172797,  "cod": 200,正确

  • 相关阅读:
    HTML
    短信发送平台-阿里大于
    java基础练习题
    2019年让程序员崩溃的 60 个瞬间,笑死我了
    JDBC连接时出现的问题总结
    Java 学习笔记 IO流与File操作
    Java 学习笔记 两大集合框架Map和Collection
    我的github博客地址
    重新认识mapreduce
    java打字游戏
  • 原文地址:https://www.cnblogs.com/AlvinLiang/p/4128190.html
Copyright © 2011-2022 走看看