首页 > 代码库 > Json.Net使用JSON Schema验证JSON格式【实例】

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,正确

 

Json.Net使用JSON Schema验证JSON格式【实例】