简体   繁体   English

无法反序列化当前JSON对象(例如{“ name”:“ value”})为类型'System.Collections.Generic.List

[英]Cannot deserialize the current JSON object (e.g. {“name”:“value”}) into type 'System.Collections.Generic.List

I have the following code 我有以下代码

public async Task<ActionResult> GetExtendedProperties()
        {
            Uri serviceRoot = new Uri(SettingsHelper.AzureAdGraphApiEndPoint);
            var token = AppToken.GetAppToken();
            var adClient = AuthenticationHelper.GetActiveDirectoryClient();

            Microsoft.Azure.ActiveDirectory.GraphClient.Application app = (Microsoft.Azure.ActiveDirectory.GraphClient.Application)adClient.Applications.Where(
                a => a.AppId == SettingsHelper.ClientId).ExecuteSingleAsync().Result;
            if (app == null)
            {
                throw new ApplicationException("Unable to get a reference to application in Azure AD.");
            }

            string requestUrl = string.Format("https://graph.windows.net/{0}/applications/{1}/extensionProperties?api-version=1.5", SettingsHelper.Tenant, app.ObjectId);

            HttpClient hc = new HttpClient();
            hc.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue(
                "Bearer", token);

            HttpResponseMessage hrm = await hc.GetAsync(new Uri(requestUrl));

            if (hrm.IsSuccessStatusCode)
            {
                string jsonresult = await hrm.Content.ReadAsStringAsync();


                return View();
            }
            else
            {
                return View();
            }
        }

and it returns this string 它返回这个字符串

{"odata.metadata":"https://graph.windows.net/mysaasapp.onmicrosoft.com/$metadata#directoryObjects/Microsoft.DirectoryServices.ExtensionProperty","value":[{"odata.type":"Microsoft.DirectoryServices.ExtensionProperty","objectType":"ExtensionProperty","objectId":"f751a646-2cc1-4e30-bfc6-a8217c0ce0a3","deletionTimestamp":null,"appDisplayName":"","name":"extension_33e037a7b1aa42ab96936c22d01ca338_Modulos","dataType":"String","isSyncedFromOnPremises":false,"targetObjects":["User"]},{"odata.type":"Microsoft.DirectoryServices.ExtensionProperty","objectType":"ExtensionProperty","objectId":"80aabe1b-b020-41d1-bd2d-cc04af264fe5","deletionTimestamp":null,"appDisplayName":"","name":"extension_33e037a7b1aa42ab96936c22d01ca338_ModulesPerUser","dataType":"String","isSyncedFromOnPremises":false,"targetObjects":["User"]},{"odata.type":"Microsoft.DirectoryServices.ExtensionProperty","objectType":"ExtensionProperty","objectId":"6e3d7592-7a66-4792-b408-891251197868","deletionTimestamp":null,"appDisplayName":"","name":"extension_33e037a7b1aa42ab96936c22d01ca338_Comasdasa3dsdaspInfo","dataType":"String","isSyncedFromOnPremises":false,"targetObjects":["User"]},{"odata.type":"Microsoft.DirectoryServices.ExtensionProperty","objectType":"ExtensionProperty","objectId":"93a26374-4135-4f29-9f24-4154522449ec","deletionTimestamp":null,"appDisplayName":"","name":"extension_33e037a7b1aa42ab96936c22d01ca338_CompInfo","dataType":"String","isSyncedFromOnPremises":false,"targetObjects":["User"]},{"odata.type":"Microsoft.DirectoryServices.ExtensionProperty","objectType":"ExtensionProperty","objectId":"21a8a3d4-f4b4-45b4-8d07-55d450db35f2","deletionTimestamp":null,"appDisplayName":"","name":"extension_33e037a7b1aa42ab96936c22d01ca338_CompanyNameForSaasApp","dataType":"String","isSyncedFromOnPremises":false,"targetObjects":["User"]},{"odata.type":"Microsoft.DirectoryServices.ExtensionProperty","objectType":"ExtensionProperty","objectId":"7b3109e0-8710-4d1a-81c3-2b6a83fb62ee","deletionTimestamp":null,"appDisplayName":"","name":"extension_33e037a7b1aa42ab96936c22d01ca338_Compania","dataType":"String","isSyncedFromOnPremises":false,"targetObjects":["User"]}]}

Using json2charp, I created this class: 使用json2charp,我创建了此类:

public class ActiveDirectorySchemaExtension
    {
        public string objectType { get; set; }
        public string objectId { get; set; }
        public object deletionTimestamp { get; set; }
        public string appDisplayName { get; set; }
        public string name { get; set; }
        public string dataType { get; set; }
        public bool isSyncedFromOnPremises { get; set; }
        public List<string> targetObjects { get; set; }
    }

How can I convert that string into a List so that I can easy manipulate it on the view? 如何将字符串转换为列表,以便可以在视图上轻松操作它?

Update: I tried this: 更新:我试过了:

 List<ActiveDirectorySchemaExtension> tmp = JsonConvert.DeserializeObject<List<ActiveDirectorySchemaExtension>>(jsonresult);

but I got this 但我明白了

Cannot deserialize the current JSON object (eg {"name":"value"}) into type 'System.Collections.Generic.List`1[CapatechSaasApp.Areas.GlobalAdmin.Models.ActiveDirectorySchemaExtension]' because the type requires a JSON array (eg [1,2,3]) to deserialize correctly. 无法反序列化当前JSON对象(例如{“ name”:“ value”})为类型'System.Collections.Generic.List`1 [CapatechSaasApp.Areas.GlobalAdmin.Models.ActiveDirectorySchemaExtension]',因为该类型需要JSON数组(例如[1,2,3])以正确反序列化。 To fix this error either change the JSON to a JSON array (eg [1,2,3]) or change the deserialized type so that it is a normal .NET type (eg not a primitive type like integer, not a collection type like an array or List) that can be deserialized from a JSON object. 要解决此错误,可以将JSON更改为JSON数组(例如[1,2,3]),也可以更改反序列化类型,使其成为普通的.NET类型(例如,不像整数这样的原始类型,也不像这样的集合类型。数组或列表),可以从JSON对象反序列化。 JsonObjectAttribute can also be added to the type to force it to deserialize from a JSON object. 还可以将JsonObjectAttribute添加到类型中,以强制其从JSON对象反序列化。 Path '['odata.metadata']', line 1, position 18. 路径'['odata.metadata']',第1行,位置18。

You can use DataContractSerializer 您可以使用DataContractSerializer

var serializer = new DataContractJsonSerializer(typeof(RootObject));
var ms = new MemoryStream(Encoding.Unicode.GetBytes(json));
var root = serializer.ReadObject(ms) as RootObject;

But also you should mark your classes with [DataContract] attribute and members with [DataMember] attribute. 但是,您还应该使用[DataContract]属性标记类,并使用[DataMember]属性标记成员。

Like this: 像这样:

 [DataContract]
    public class RootObject
    {
        [DataMember(Name = "odata.metadata")]
        public string metadata { get; set; }
        [DataMember]
        public List<ActiveDirectorySchemaExtension> value { get; set; }
    }

Also, you've lost one field in your class ActiveDirectorySchemaExtension - odataType. 同样,您在类ActiveDirectorySchemaExtension-odataType中丢失了一个字段。 You can deserialize it like this: 您可以像这样反序列化:

[DataMember(Name = "odata.type")]
public string odataType { get; set; }

You forgot your parent object in json2csharp. 您在json2csharp中忘记了父对象。

Demo on .NETFiddle .NETFiddle上的演示

using System;
using System.Collections.Generic;
using Newtonsoft.Json;

public class ActiveDirectorySchemaExtension // You can switch from the original class name to yours
{
    public string Type { get; set; }        // You should switch to PascalCase to respect C# notation
    public string ObjectType { get; set; }
    public string ObjectId { get; set; }
    public object DeletionTimestamp { get; set; }
    public string AppDisplayName { get; set; }
    public string Name { get; set; }
    public string DataType { get; set; }
    public bool IsSyncedFromOnPremises { get; set; }
    public List<string> TargetObjects { get; set; }
}

public class RootObject
{
    public string Metadata { get; set; }
    public List<ActiveDirectorySchemaExtension> Value { get; set; }
}

public void Main()
{
    var json = "{'odata.metadata':'https://graph.windows.net/mysaasapp.onmicrosoft.com/$metadata#directoryObjects/Microsoft.DirectoryServices.ExtensionProperty','value':[{'odata.type':'Microsoft.DirectoryServices.ExtensionProperty','objectType':'ExtensionProperty','objectId':'f751a646-2cc1-4e30-bfc6-a8217c0ce0a3','deletionTimestamp':null,'appDisplayName':'','name':'extension_33e037a7b1aa42ab96936c22d01ca338_Modulos','dataType':'String','isSyncedFromOnPremises':false,'targetObjects':['User']},{'odata.type':'Microsoft.DirectoryServices.ExtensionProperty','objectType':'ExtensionProperty','objectId':'80aabe1b-b020-41d1-bd2d-cc04af264fe5','deletionTimestamp':null,'appDisplayName':'','name':'extension_33e037a7b1aa42ab96936c22d01ca338_ModulesPerUser','dataType':'String','isSyncedFromOnPremises':false,'targetObjects':['User']},{'odata.type':'Microsoft.DirectoryServices.ExtensionProperty','objectType':'ExtensionProperty','objectId':'6e3d7592-7a66-4792-b408-891251197868','deletionTimestamp':null,'appDisplayName':'','name':'extension_33e037a7b1aa42ab96936c22d01ca338_Comasdasa3dsdaspInfo','dataType':'String','isSyncedFromOnPremises':false,'targetObjects':['User']},{'odata.type':'Microsoft.DirectoryServices.ExtensionProperty','objectType':'ExtensionProperty','objectId':'93a26374-4135-4f29-9f24-4154522449ec','deletionTimestamp':null,'appDisplayName':'','name':'extension_33e037a7b1aa42ab96936c22d01ca338_CompInfo','dataType':'String','isSyncedFromOnPremises':false,'targetObjects':['User']},{'odata.type':'Microsoft.DirectoryServices.ExtensionProperty','objectType':'ExtensionProperty','objectId':'21a8a3d4-f4b4-45b4-8d07-55d450db35f2','deletionTimestamp':null,'appDisplayName':'','name':'extension_33e037a7b1aa42ab96936c22d01ca338_CompanyNameForSaasApp','dataType':'String','isSyncedFromOnPremises':false,'targetObjects':['User']},{'odata.type':'Microsoft.DirectoryServices.ExtensionProperty','objectType':'ExtensionProperty','objectId':'7b3109e0-8710-4d1a-81c3-2b6a83fb62ee','deletionTimestamp':null,'appDisplayName':'','name':'extension_33e037a7b1aa42ab96936c22d01ca338_Compania','dataType':'String','isSyncedFromOnPremises':false,'targetObjects':['User']}]}";
    var o = JsonConvert.DeserializeObject<RootObject>(json);
    Console.WriteLine(o.Value[0].Name);
}

output : 输出:

extension_33e037a7b1aa42ab96936c22d01ca338_Modulos

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 无法将当前 JSON object(例如 {"name":"value"})反序列化为类型 'System.Collections.Generic.List`1 - Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List`1 无法将当前JSON对象(例如{“ name”:“ value”})反序列化为类型&#39;System.Collections.Generic.List`1&#39; - Cannot deserialize the current JSON object (e.g. {“name”:“value”}) into type 'System.Collections.Generic.List`1' JSON.Net - 无法将当前json对象(例如{“name”:“value”})反序列化为类型&#39;system.collections.generic.list`1 - JSON.Net - cannot deserialize the current json object (e.g. {“name”:“value”}) into type 'system.collections.generic.list`1 错误:无法将当前 JSON object(例如 {“name”:“value”})反序列化为类型 'System.Collections.Generic.List`1 - Error: Cannot deserialize the current JSON object (e.g. {“name”:“value”}) into type 'System.Collections.Generic.List`1 JsonSerializationException:无法将当前 JSON object(例如 {"name":"value"})反序列化为类型 'System.Collections。 - JsonSerializationException: Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.List JSON .NET-将当前JSON对象(例如{“ name”:“ value”})反序列化为类型&#39;System.Collections.Generic.List`1 - JSON .NET - annot deserialize the current JSON object (e.g. {“name”:“value”}) into type 'System.Collections.Generic.List`1 无法将当前JSON对象(例如{“ name”:“ value”})反序列化为类型“ System.Collections.Generic.ICollection`1 [System.Double]” - Cannot deserialize the current JSON object (e.g. {“name”:“value”}) into type 'System.Collections.Generic.ICollection`1[System.Double]' 无法将当前JSON对象(例如{“ name”:“ value”})反序列化为类型“ System.Collections.Generic.IEnumerable`1 [WebApplication1.UserInfo]” - Cannot deserialize the current JSON object (e.g. {“name”:“value”}) into type 'System.Collections.Generic.IEnumerable`1[WebApplication1.UserInfo]' 无法将当前 JSON 对象(例如 {&quot;name&quot;:&quot;value&quot;})反序列化为类型 &#39;System.Collections.Generic.IList 问题 - Cannot deserialize the current JSON object (e.g. {"name":"value"}) into type 'System.Collections.Generic.IList problem 无法将JSON对象反序列化为“System.Collections.Generic.List”类型 - Cannot deserialize JSON object into type 'System.Collections.Generic.List'
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM