C# 反序列化OData。错误消息
我有一个ASP.NET应用程序,它使用Azure AD Graph API。通常,当对Graph API执行无效操作时,会引发异常 以下代码显示将触发异常的无效图形API调用:C# 反序列化OData。错误消息,c#,json,json.net,odata,azure-ad-graph-api,C#,Json,Json.net,Odata,Azure Ad Graph Api,我有一个ASP.NET应用程序,它使用Azure AD Graph API。通常,当对Graph API执行无效操作时,会引发异常 以下代码显示将触发异常的无效图形API调用: // Query the Azure AD User var userToUpdate = await activeDirectoryClient.Users.GetByObjectId("user@domain.net").ExecuteAsync(); // Set given name to an empty s
// Query the Azure AD User
var userToUpdate = await activeDirectoryClient.Users.GetByObjectId("user@domain.net").ExecuteAsync();
// Set given name to an empty string (not allowed)
userToUpdate.GivenName = "";
try
{
// Update the user in Azure AD
await userToUpdate.UpdateAsync();
}
catch (Exception e)
{
// Return exception message
}
内部异常的消息是一个JSON字符串,每个引号前都有斜杠。它看起来像这样:
"{\"odata.error\":{\"code\":\"Request_BadRequest\",\"message\":{\"lang\":\"en\",\"value\":\"Invalid value specified for property 'givenName' of resource 'User'.\"},\"values\":[{\"item\":\"PropertyName\",\"value\":\"givenName\"},{\"item\":\"PropertyErrorCode\",\"value\":\"InvalidValue\"}]}}"
附加找到异常消息的本地窗口的屏幕截图:
我想将此JSON转换为.NET对象,以返回详细的错误信息。为此,我使用JSON.NET库,并假设JSON将反序列化为ODataError
对象:
var error = Newtonsoft.Json.JsonConvert.DeserializeObject<ODataError>(e.InnerException.Message);
var error=Newtonsoft.Json.JsonConvert.DeserializeObject(e.InnerException.Message);
但是,反序列化对象的值始终为null
,这意味着转换未按预期进行
也就是说,上面的JSON字符串应该映射到哪个类?另外,我是否应该从字符串中删除前斜杠以进行正确的反序列化?反序列化后为空的原因是您的JSON对象属性名称与Microsoft.Azure.ActiveDirectory.GraphClient.ODataError不同类属性名称-“odata.error”属性无法反序列化为Microsoft.Azure.ActiveDirectory.GraphClient.ODataError的错误属性 作为解决方法,我添加了自己的类型以实现正确的反序列化:
internal class ODataError
{
[JsonProperty("odata.error")]
public ODataErrorCodeMessage Error { get; set; }
}
internal class ODataErrorCodeMessage
{
public string Code { get; set; }
public ODataErrorMessage Message { get; set; }
public List<ExtendedErrorValue> Values { get; set; }
}
internal class ExtendedErrorValue
{
public string Item { get; set; }
public string Value { get; set; }
}
internal class ODataErrorMessage
{
public string Lang { get; set; }
public string Value { get; set; }
}
内部类ODataError
{
[JsonProperty(“odata.error”)]
公共ODataErrorCodeMessage错误{get;set;}
}
内部类ODataErrorCodeMessage
{
公共字符串代码{get;set;}
公共ODataErrorMessage消息{get;set;}
公共列表值{get;set;}
}
内部类ExtendedErrorValue
{
公共字符串项{get;set;}
公共字符串值{get;set;}
}
内部类ODataErrorMessage
{
公共字符串Lang{get;set;}
公共字符串值{get;set;}
}
在正确反序列化JSON消息之后:
...
try
{
await ADClient.Users.AddUserAsync(newUser);
return Result.Ok();
}
catch (DataServiceRequestException ex)
{
var innerException = ex.InnerException;
var error = JsonConvert.DeserializeObject<ODataError>(innerException.Message);
return Result.Fail(new Error(error.Error.Message.Value, error.Error.Code, ex));
}
。。。
尝试
{
等待ADClient.Users.AddUserAsync(newUser);
返回Result.Ok();
}
捕获(DataServiceRequestException ex)
{
var innerException=ex.innerException;
var error=JsonConvert.DeserializeObject(innerException.Message);
返回Result.Fail(新错误(Error.Error.Message.Value,Error.Error.Code,ex));
}
您想做什么?您是如何拨打OData电话的?您使用什么客户端?异常的类型是什么?ODataErrorException已具有具有反序列化错误的属性。在任何其他情况下,异常消息将包含由客户机生成的特定消息(可能是在反序列化任何特定错误消息之后),而不是原始Json部分。您需要阅读回复才能访问原始的jsonHi@PanagiotisKanavos,谢谢您的评论。我用更多的代码示例更新了这个问题,我希望我澄清了我试图实现的目标。如果我需要进一步解释它的任何部分,请告诉我。您仍然没有解释-抛出的异常类型是什么?如果是ODataErrorException,则无需执行任何操作,只需捕获正确的异常类型即可。至于原始Json,您在异常对象中找不到它。很抱歉,异常类型是System.Data.Services.Client.DataServiceRequestException
,其内部异常类型是System.Data.Services.Client.DataServiceClientException
。问题中的JSON字符串是InnerException的消息。这就是为什么我很难确定将字符串转换为哪种类型的异常。您是否仍然需要创建自己的类型进行反序列化,或者Microsoft是否对此进行了更新?