阵列的反序列化不支持类型'SalesforceDataQueryComponent.Utils.SfdcObjects + SfdcCollection

时间:2015-07-31 16:58:31

标签: c# arrays json json-deserialization

JavaScriptSerializer jsSerializer = new JavaScriptSerializer();    
// Deserialize the response to get an array of CUSTOM Cases
    var reportsList = jsSerializer.Deserialize<SfdcObjects.SfdcCollection<SfdcObjects.Assets>>(HttpUtility.UrlDecode(response));

抛出异常:

  

错误:System.InvalidOperationException:输入'SalesforceDataQueryComponent.Utils.SfdcObjects + SfdcCollection`1 [   [SalesforceDataQueryComponent.Utils.SfdcObjects + Assets,SalesforceDataQueryComponent,Version = 1.2.0.0,Culture = neutral]]'   不支持反序列化数组。

我无法弄清楚这个问题:

物件:

namespace SalesforceDataQueryComponent.Utils
{
    class SfdcObjects
    {
        // Used for Authentication
        public class TokenResponse
        {
            public string id { get; set; }
            public string issued_at { get; set; }
            public string refresh_token { get; set; }
            public string instance_url { get; set; }
            public string signature { get; set; }
            public string access_token { get; set; }
        }

        // All classes shown next are used to parse the HttpGet Response
        public class SfdcCollection<T>
        {
            public bool Done { get; set; }
            public int Size { get; set; }
            public string NextRecordsUrl { get; set; }
            public List<T> Records { get; set; }
        }

        public class SfdcAttributes
        {
            public string Type { get; set; }
            public string Url { get; set; }
        }

        public class Accounts : Account
        {
            public SfdcAttributes Attributes { get; set; }
        }

        public class Assets : Asset
        {
            public SfdcAttributes Attributes { get; set; }
        }

        public class CustomAssets : Assets
        {
            public string StringInstallDate { get; set; }
        }

        public class Users : User
        {
            public SfdcAttributes Attributes { get; set; }
        }

        public class CustomCase : Case
        {
            public string StringCreatedDate { get; set; }
        }

        public class CustomCases : CustomCase
        {
            public SfdcAttributes Attributes { get; set; }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您的问题中未包含响应JSON,但是从错误消息中,您的问题必须是响应中的根JSON容器是数组。根据{{​​3}},JSON数组如下所示:

[value1, value2, ..., valueN]

JSON序列化程序映射从JSON数组到JSON数组实现ICollectionIEnumerable的类型。

然而,您的根对象SfdcCollection<T>不是集合或可枚举的,尽管它的名称。相反,它是一个不可枚举的通用PO​​CO:

    public class SfdcCollection<T> // No IEnumerable<T>
    {
        public bool Done { get; set; }
        public int Size { get; set; }
        public string NextRecordsUrl { get; set; }
        public List<T> Records { get; set; }
    }

因此,序列化程序会将此映射到JSON 对象(这是一组键/值对,看起来像{"name1" : value1, "name2" : value2, ..., "nameN" : valueN })而不是数组。

您需要将数据模型更新为您实际接收的JSON。尝试将JSON上传到JSON standard,它会自动为您生成类。

如果您必须使用问题中的类,您可以http://json2csharp.com/使用所需的序列化程序(例如Json.NET,DataContractJsonSerializer,了解如何将实际接收的JSON映射到所需的类。 ,JavaScriptSerializer或其他等。)