Десериализовать json способом «TryParse».C#

Место общения программистов C#
Ответить
Anonymous
 Десериализовать json способом «TryParse».

Сообщение Anonymous »

Когда я отправляю запрос к сервису (который мне не принадлежит), он может ответить либо запрошенными данными JSON, либо ошибкой, которая выглядит следующим образом:

Код: Выделить всё

{
"error": {
"status": "error message",
"code": "999"
}
}
В обоих случаях код ответа HTTP — 200 OK, поэтому я не могу использовать его, чтобы определить, есть ошибка или нет — мне нужно десериализовать ответ, чтобы проверить.
Итак, у меня есть что-то похожее на это:

Код: Выделить всё

bool TryParseResponseToError(string jsonResponse, out Error error)
{
// Check expected error keywords presence
// before try clause to avoid catch performance drawbacks
if (jsonResponse.Contains("error") &&
jsonResponse.Contains("status") &&
jsonResponse.Contains("code"))
{
try
{
error = new JsonSerializer().DeserializeFromString(jsonResponse);
return true;
}
catch
{
// The JSON response seemed to be an error, but failed to deserialize.
// Or, it may be a successful JSON response: do nothing.
}
}

error = null;
return false;
}
Здесь у меня есть пустое предложение catch, которое может находиться в стандартном пути выполнения, а это неприятный запах... Ну, более чем неприятный запах: он воняет .

Знаете ли вы лучший способ "TryParse" ответа, чтобы избежать подвоха в стандартный путь выполнения?

[EDIT]

Благодаря ответу Ювала Ицчакова я улучшил свой метод следующим образом:< /p>

Код: Выделить всё

bool TryParseResponse(string jsonResponse, out Error error)
{
// Check expected error keywords presence :
if (!jsonResponse.Contains("error") ||
!jsonResponse.Contains("status") ||
!jsonResponse.Contains("code"))
{
error = null;
return false;
}

// Check json schema :
const string errorJsonSchema =
@"{
'type': 'object',
'properties': {
'error': {'type':'object'},
'status': {'type': 'string'},
'code': {'type': 'string'}
},
'additionalProperties': false
}";
JsonSchema schema = JsonSchema.Parse(errorJsonSchema);
JObject jsonObject = JObject.Parse(jsonResponse);
if (!jsonObject.IsValid(schema))
{
error = null;
return false;
}

// Try to deserialize :
try
{
error = new JsonSerializer.DeserializeFromString(jsonResponse);
return true;
}
catch
{
// The JSON response seemed to be an error, but failed to deserialize.
// This case should not occur...
error = null;
return false;
}
}
Я сохранил пункт ловушки... на всякий случай.

Подробнее здесь: https://stackoverflow.com/questions/239 ... yparse-way
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»