2017-09-05 84 views
0

我在這裏已經看到了一些問題herehere但仍無法進行以下工作。解析多個可能的Json響應

對於任一這些響應其在ex.Message的:

響應1

[ 
    { 
    "validationErrorType": "WrongType", 
    "message": "Validation error of type WrongType", 
    "errorType": "ValidationError" 
    } 
] 

響應2

[ 
    { 
    "message": "Validation error of type WrongType:", 
    "errorType": "ValidationError" 
    } 
] 

我試圖動態解析此作爲如下:

JArray parsedJObject = JArray.Parse(ex.Message); 

JSchema oldSchema = JSchema.Parse(@" 
      { 
       'type': 'array', 
       'properties': { 
        'message': {'type': 'string'}, 
        'errorType': {'type': 'string'} 
      }, 
      'additionalProperties': false 
      }"); 

JSchema graphQlSchema = JSchema.Parse(@" 
      { 
       'type': 'array', 
       'properties': { 
        'validationErrorType': {'type': 'string'}, 
        'message': {'type': 'string'}, 
        'errorType': {'type': 'string'} 
      }, 
      'additionalProperties': false 
      }"); 

if (parsedJObject.IsValid(oldSchema)) // IsValid - 1 
{ 
    // Do stuff 
} 
else if (parsedJObject.IsValid(graphQlSchema)) // IsValid - 2 
{ 
    // Do stuff 
} 

但是,兩個IsValid()調用都會爲任一響應返回true。我在這裏做錯了什麼?

對於反應1,我期待IsValid - 1返回trueIsValid - 2返回false

,以及針對響應2,我期待IsValid - 1返回falseIsValid - 2返回true

更新

按照David Kujawskidbc給出的建議l通過JArray,並添加我已取得進展的required屬性。

我的更新代碼在下面,但仍在努力驗證具有嵌套locations對象的架構。

響應

[ 
    { 
    "validationErrorType": "WrongType", 
    "locations": [ 
     { 
     "line": 4, 
     "column": 1 
     } 
    ], 
    "message": "Validation error of type WrongType", 
    "errorType": "ValidationError" 
    } 
] 

架構定義:

JSchema graphQlSchema = JSchema.Parse(@" 
    { 
     'type': 'object', 
     'properties': 
     { 
      'validationErrorType': {'type': 'string'}, 
      'locations':   
       { 
        'type': 'object', 
        'properties': 
        { 
         'line': {'type': 'string'}, 
         'column': {'type': 'string'} 
        } 
       }, 
      'message':    {'type': 'string'}, 
      'errorType':   {'type': 'string'} 
     }, 
     'additionalProperties': false, 
     'required': ['message', 'errorType', 'validationErrorType', 'locations'] 
    }"); 

解析響應

JArray parsedJObject = JArray.Parse(ex.Message); 

foreach (JToken child in parsedJObject.Children()) 
{ 
    if (child.IsValid(graphQlSchema)) // Not resolving to true 
    { 
     var graphQlSchemaDef = new[] 
         { 
          new 
          { 
           validationErrorType = string.Empty, 
           locations = new 
            { 
             line = string.Empty, 
             column = string.Empty 
            }, 
           message = string.Empty, 
           errorType = string.Empty 
          } 
         }; 

     var exceptionMessages = JsonConvert.DeserializeAnonymousType(ex.Message, graphQlSchemaDef); 

     foreach (var message in exceptionMessages) 
     { 
      // Do stuff 
     } 
    } 
} 
+0

它們是相似的。只有* validationErrorType *可以是空的 –

+0

我不明白你的意思。你能澄清嗎? –

+0

屬性* validationErrorType *是一個字符串,字符串是一個引用類型,可以是* null * –

回答

2

您的問題與JArray vs JObject。如果你真的想把ex.Message作爲一個數組來處理,那麼你需要遍歷數組的子節點。此外,將您的JsonSchema從「數組」更改爲「對象」。以下作品如您所述:

 JArray parsedJObject = JArray.Parse(ex.Message); 

     JSchema oldSchema = JSchema.Parse(@" 
     { 
      'type': 'object', 
      'properties': { 
       'message': {'type': 'string'}, 
       'errorType': {'type': 'string'} 
      }, 
      'additionalProperties': false 
     }"); 

     JSchema graphQlSchema = JSchema.Parse(@" 
     { 
      'type': 'object', 
      'properties': { 
       'validationErrorType': {'type': 'string'}, 
       'message': {'type': 'string'}, 
       'errorType': {'type': 'string'} 
      }, 
      'additionalProperties': false 
     }"); 

     foreach (var item in parsedJObject.Children()) 
     { 
      if (item.IsValid(oldSchema)) // IsValid - 1 
      { 
       // Do stuff 
      } 
      else if (item.IsValid(graphQlSchema)) // IsValid - 2 
      { 
       // Do stuff 
      } 
     }