当类型不同时,如何使用JSON.NET验证JSON?

时间:2018-02-12 23:05:41

标签: json json.net

我有一个返回JSON的网络电话。

响应调用可以是数组也可以是对象。

我想验证响应是否是数组。

我正在使用JSON.NET。

这是我的架构:

    string planElevationListSchema = @"{
        'description': 'Plan elevation object array',
        'type': 'array',
        'items': {
            'type': 'object',
            'properties': {
                'COMMUNITYNUMBER': { 'type': 'string' },
                'PLANNUMBER': { 'type': 'string' },
                'ELEVATION': { 'type': 'string' }
            }
        }
    }";

这是我的代码:

JsonSchema schema = JsonSchema.Parse(planElevationListSchema);

JArray planElevationList = JArray.Parse(responseFromServer.ToString());

bool isValid = planElevationList.IsValid(schema);

如果返回JSON对象,我会得到一个

  

"从JsonReader读取JArray时出错。当前的JsonReader项目不是   一个数组:StartObject。路径'',第1行,第1位。"

我是否需要将我的代码包装在try / catch中或为该对象创建另一个模式?

无论我用什么来解析响应都会引发异常。

如何处理?

这是返回的对象的样子:

  

" {\"错误\":\" 44003150099没有有效计划/提升\" }"

这是返回的有效对象数组:

  

" [{\" COMMUNITYNUMBER \":\" 44002050000 \" \" PLANNUMBER \":\" 1700 \" \"立面图\":\" A \"},{\" COMMUNITYNUMBER \":\" 44002050000 \" \" PLANNUMBER \":\" 1700 \" \"立面图\":\"乙\ "},{\" COMMUNITYNUMBER \":\" 44002050000 \" \" PLANNUMBER \":\" 1700 \ " \"立面图\":\" C ^ \"},{\" COMMUNITYNUMBER \":\" 44002050000 \ " \" PLANNUMBER \":\" 1700 \" \"立面图\":\" d \&# 34;},{\" COMMUNITYNUMBER \":\" 44002050000 \" \" PLANNUMBER \":\" 1800 \&# 34; \"立面图\":\" A \"},{\" COMMUNITYNUMBER \":\" 44002050000 \&# 34; \" PLANNUMBER \":\" 1800 \" \"立面图\":\"乙\" },{\" COMMUNITYNUMBER \":\" 44002050000 \" \" PLANNUMBER \":\" 1800 \" ,\"立面图\":\" C ^ \"},{\" COMMUNITYNUMBER \":\" 44002050000 \" ,\" PLANNUMBER \":\&#34 ; 1800 \" \"立面图\":\" d \"},{\" COMMUNITYNUMBER \":\&#34 ; 44002050000 \" \" PLANNUMBER \":\" 1890 \" \"立面图\":\" A \"},{\" COMMUNITYNUMBER \":\" 44002050000 \" \" PLANNUMBER \":\" 1890年\" \"立面图\":\"乙\"},{\" COMMUNITYNUMBER \":\" 44002050000 \" \" PLANNUMBER \":\" 1890 \" \"立面图\":\" C ^ \& #34;},{\" COMMUNITYNUMBER \":\" 44002050000 \" \" PLANNUMBER \":\" 1890 \& #34; \"立面图\":\" d \"},{\" COMMUNITYNUMBER \":\" 44002050000 \& #34; \" PLANNUMBER \":\" 2270 \" \"立面图\":\" A \&#34 ;},{\" COMMUNITYNUMBER \":\" 44002050000 \" \" PLANNUMBER \":\" 2270 \&#34 ; \"立面图\":\"乙\"},{\" COMMUNITYNUMBER \":\" 44002050000 \&#34 ; \" PLANNUMBER \":\" 2270 \" \"立面图\":\" C ^ \"} {\" COMMUNITYNUMBER \":\" 440020 50000 \" \" PLANNUMBER \":\" 2270 \" \"立面图\":\" d \ "},{\" COMMUNITYNUMBER \":\" 44002050000 \" \" PLANNUMBER \":\" 2440 \ " \"立面图\":\" A \"},{\" COMMUNITYNUMBER \":\" 44002050000 \ " \" PLANNUMBER \":\" 2440 \" \"立面图\":\"乙\&# 34;},{\" COMMUNITYNUMBER \":\" 44002050000 \" \" PLANNUMBER \":\" 2440 \&# 34; \"立面图\":\" C ^ \"},{\" COMMUNITYNUMBER \":\" 44002050000 \&# 34; \" PLANNUMBER \":\" 2440 \" \"立面图\":\" d \" }]"

2 个答案:

答案 0 :(得分:0)

您可以使用JToken.Parse()来解析任何格式正确的JSON:

willPresent

您还可以检查实际的JToken.Type以进行后续处理,例如:

var schema = JsonSchema.Parse(planElevationListSchema); 

var planElevations = JToken.Parse(responseFromServer.ToString());
var isValid = planElevations.IsValid(schema);

示例工作.Net fiddle。另请参阅 JSON.NET: Why Use JToken--ever? ,其中介绍了可能希望使用抽象基类JToken的其他情况。

答案 1 :(得分:-1)

更改'到"。见下文:

{
  "description": "Plan elevation object array",
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "COMMUNITYNUMBER": {
        "type": "string"
      },
      "PLANNUMBER": {
        "type": "string"
      },
      "ELEVATION": {
        "type": "string"
      }
    }
  }
}