c# - 无法将当前 JSON 数组(例如 [1,2,3])反序列化为具有复杂和嵌套对象的类型

标签 c# asp.net-web-api json.net jsonserializer

我正在尝试为复杂对象构建 Web api。为此,我构建了自定义绑定(bind)器,该绑定(bind)器从 JSON 反序列化该对象。

我的客户 Binder 看起来像:

var paramType = p_BindingContext.ModelType;

    dynamic updatedParam = Activator.CreateInstance(paramType);

    JsonReader reader = new JTokenReader(JObject.Parse
    (p_ActionContext.Request.Content.ReadAsStringAsync().Result));

    JObject jObject = JObject.Load(reader);

    JsonSerializer serializer = new JsonSerializer();

    serializer.Populate(jObject.CreateReader(), updatedParam);//Here the exception thorws

    p_BindingContext.Model = updatedParam; 

要序列化的对象非常复杂:

          public class ModelRegisterUserRequest{

              public ModelUser User { get; set; }

    public CampaignItem CampaignWithChosenProposal { get; set; }

    public string ValidationToken { get; set; }

    public string IVRToken { get; set; }

    public string DealerID { get; set; }

    public string SalePersonID { get; set; }
             }

public class CampaignItem
{

    public List<BannerItem> Banners { get; set; }

    public string Code { get; set; }

    public string CustomerInstruction { get; set; }

    public string InfoLink { get; set; }

    public string LobbySubTitle { get; set; }

    public string LobbyTitle { get; set; }

    public string MoreText { get; set; }

    public uint NumOfColumns { get; set; }

    public uint NumOfRows { get; set; }

    public string OriginString { get; set; }
    public int OriginInt { get; set; }

    public List<ProposalItem> Proposals { get; set; }

    public string RegulationsInfoLink { get; set; }

    public string ServiceType { get; set; }

    public string SubTitle { get; set; }

    public string SWDefault { get; set; }

    public string Title { get; set; }   
}

public partial class ProposalItem
{

    public List<string> EquipmentsCode { get; set; }


    public string FeatureCode { get; set; }


    public string InvalidReason { get; set; }


    public bool IsExistsMoreInfo { get; set; }


    public bool IsValid { get; set; }


    public string LeadCode { get; set; }


    public int ParamCombinationCode { get; set; }


    public string ProductCode { get; set; }


    public string ProductCombinationCode { get; set; }


    public string ProposalCode { get; set; }


    public List<ColumnItem> Columns { get; set; }


    public List<MoreInfoItem> MoreInfoList { get; set; }


    public List<string> PricePlans { get; set; }

    public string ProductName { get; set; }    

}

Json 是使用 JavaScript 代码中的 JSON.stringify 命令创建的,如下所示:

 {
   "ValidationToken": "1cc6cca8-44d5-4042-af37-de6a0d198d17",
  "AppID": "TST",
  "campaignWithChosenProposal": {
    "Banners": [
      {
        "LocationCodeString": "ManagerTab",
        "LocationCodeInt": 256,
        "MediaUrl": "<a href=\"c:\\\">BANNER 10</a>"
      }
    ],
    "Code": "CAMP221",
    "CustomerInstruction": "-1",
    "InfoLink": "http://test.aspx",
    "LobbySubTitle": "",
    "LobbyTitle": "",
    "MoreText": "",
    "NumOfColumns": 0,
    "NumOfRows": 0,
    "OriginString": "INT",
    "OriginInt": 4,
    "Proposals": [
      [
        {
          "EquipmentsCode": [
            "5455"
          ],
          "FeatureCode": "BE5455",
          "InvalidReason": "",
          "IsExistsMoreInfo": true,
          "IsValid": true,
          "LeadCode": "3792956510",
          "ParamCombinationCode": 0,
          "ProductCode": "OANTIVRP2",
          "ProductCombinationCode": "0",
          "ProposalCode": "291600010201C8F83661D5B82FD5F3603967588B7A72",
          "Columns": [
            {
              "Content": ""
            },
            {
              "Content": ""
            },
            {
              "Content": ""
            },
            {
              "Content": ""
            },
            {
              "Content": ""
            },
            {
              "Content": ""
            }
          ],
          "MoreInfoList": [
            {
              "Content": "3",
              "MoreInfoTypesString": "LicenseFrom",
              "MoreInfoTypesInt": 16
            },
            {
              "Content": "3",
              "MoreInfoTypesString": "LicenseTo",
              "MoreInfoTypesInt": 32
            },
            {
              "Content": "4.3",
              "MoreInfoTypesString": "PricePeriod1",
              "MoreInfoTypesInt": 64
            }
          ],
          "PricePlans": [
            "O2"
          ],
          "ProductName": ""
        }
      ]
    ],
    "RegulationsInfoLink": "http://www.test.aspx",
    "ServiceType": "TST",
    "SubTitle": "",
    "SWDefault": "1",
    "Title": ""
  },
  "User": {
    "CurrentLicenseNumber": 0,
    "CustomerID": "21670106",
    "FirstName": "",
    "LastName": "",
    "RequestedLicenseNumber": "3",
    "SubscriberPhoneNumber": "035448428",
    "IdentityNumber": "058470",
    "Email": "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="66070a031e070814040326010b070f0a4805090b" rel="noreferrer noopener nofollow">[email protected]</a>",
    "RegistrationStatus": "NOTREGISTERED"
  },
  "SalePersonID": "3178364",
 }

异常在序列化行上抛出,如下所示:

Cannot deserialize the current JSON array (e.g. [1,2,3]) into type WebAPI.Models.Entities.Campaigns.CampaignObjects.ProposalItem' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly.
To fix this error either change the JSON to a JSON object (e.g. {"name":"value"}) or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List<T> that can be deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array.

我花了几个晚上来解决这个异常,但没有找到任何解决方案 该网站上也有解决方案,但不支持如此复杂的问题。

https://stackoverflow.com/questions/11126242/using-jsonconvert-deserializeobject-to-deserialize-json-to-a-c-sharp-poco-class

Cannot deserialize the current JSON array (e.g. [1,2,3]) into type

有人遇到了这种 JSON 意外行为并可以提供帮助吗?

谢谢

最佳答案

根据您的 JSON 数据,您需要映射的对象必须如下所示(当然除非您有自己的 JsonDeserializer):

public class Banner
{
    public string LocationCodeString { get; set; }
    public int LocationCodeInt { get; set; }
    public string MediaUrl { get; set; }
}

public class CampaignWithChosenProposal
{
    public List<Banner> Banners { get; set; }
    public string Code { get; set; }
    public string CustomerInstruction { get; set; }
    public string InfoLink { get; set; }
    public string LobbySubTitle { get; set; }
    public string LobbyTitle { get; set; }
    public string MoreText { get; set; }
    public int NumOfColumns { get; set; }
    public int NumOfRows { get; set; }
    public string OriginString { get; set; }
    public int OriginInt { get; set; }
    public List<List<>> Proposals { get; set; }
    public string RegulationsInfoLink { get; set; }
    public string ServiceType { get; set; }
    public string SubTitle { get; set; }
    public string SWDefault { get; set; }
    public string Title { get; set; }
}

public class User
{
    public int CurrentLicenseNumber { get; set; }
    public string CustomerID { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string RequestedLicenseNumber { get; set; }
    public string SubscriberPhoneNumber { get; set; }
    public string IdentityNumber { get; set; }
    public string Email { get; set; }
    public string RegistrationStatus { get; set; }
}

public class RootObject
{
    public string ValidationToken { get; set; }
    public string AppID { get; set; }
    public CampaignWithChosenProposal campaignWithChosenProposal { get; set; }
    public User User { get; set; }
    public string SalePersonID { get; set; }
}

这是一个非常酷的工具 ( json2csharp ) 可以帮助您。

关于c# - 无法将当前 JSON 数组(例如 [1,2,3])反序列化为具有复杂和嵌套对象的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17770326/

相关文章:

c# - 使用依赖注入(inject)统一配置的简单授权服务提供者

c# - 如何访问 JObject 的子值

c# - 在 C# 中浏览动态对象 (json)

c# - "Authentication failed because the remote party has closed the transport stream"使用 FluentFTP 通过 TLS/SSL 传输到/从 FTP 服务器时

c# - 试图在 unity3d 中将游戏对象保持在屏幕左右边界内

c# - 将 [Authorize] 属性与用户的电子邮件一起使用

c# - 使用 JsonConverter 反序列化 JSON 字典值

c# - VSPackage 中的 OnEnterRunMode 不起作用

c# - 使用javascript触发按钮点击事件

c# - 如何在asp.net core中从客户端调用web api方法?