Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 反序列化OData。错误消息_C#_Json_Json.net_Odata_Azure Ad Graph Api - Fatal编程技术网

C# 反序列化OData。错误消息

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

我有一个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 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是否对此进行了更新?