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

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。