【问题标题】:asp.net Action to receive a complex json with a complex collectionasp.net 接收具有复杂集合的复杂 json 的操作
【发布时间】:2017-01-24 14:31:43
【问题描述】:

这是一个难点:基本上我想将一个复杂的 JSON 对象与一个由 不同但相似 复杂类型组成的集合映射到 C# 模型中。 这是我的 ASP.NET Web API 将接收的默认 JSON:

{
   "Id": "000111222333",
   "Move": {
      "Address2": {
         "City": "CityName",
         "Street": "StreetName",
         "PostalCode": "4444",
         "HouseNumber": "4",
         "Country": "NLD",
         "IsInhabited": "true"
      },
      "Contracts": {
         "ElectricityContract": {
            "ContractId": "000000031",
            "ContractNumber": "00000011",
            "EANCode": "53123123123123",
            "StartDate": "2000-01-20",
            "EndDate": "2017-06-06",
            "IsBuildingComplex": "false",
            "ForceSingleTariff": "false"
         },
         "CableContract": {
            "ContractId": "456454546353",
            "ContractNumber": "12312312313",
            "StartDate": "2000-01-20",
            "EndDate": "2017-01-23"
         }
      }
   }
}

我的问题是我似乎无法将不同类型的合同作为一个集合接收。

我尝试将“Contracts”序列映射到 ArrayList,但它始终为“null”。 我尝试将其映射到 ICollection/IEnumerable/List,其中所有合同都是 IContract 的一种。但这也行不通。

我已经开始从 JSON 字符串手动映射,但我希望有更好的方法来做到这一点?感谢所有帮助。

【问题讨论】:

    标签: asp.net json asp.net-web-api mapping


    【解决方案1】:

    要在此对象中获取 Contracts 集合,您需要将 JSON 更改为这个

    {
    ...      
    "Contracts": [
             {
                "ContractId": "000000031",
                "Type": "ElectricityContract",
                "ContractNumber": "00000011",
                "EANCode": "53123123123123",
                "StartDate": "2000-01-20",
                "EndDate": "2017-06-06",
                "IsBuildingComplex": "false",
                "ForceSingleTariff": "false"
             },
             {
                "ContractId": "456454546353",
                "Type" : "CableContract",
                "ContractNumber": "12312312313",
                "StartDate": "2000-01-20",
                "EndDate": "2017-01-23"
             }
          ]
    }
    

    因此,Contracts 将是 JSON 集合而不是对象,您可以使用自定义绑定将其映射到 ICollection/IEnumerable/List<IContract>。此绑定应根据 Type 属性创建不同的 IContract 实现。 如何做到这一点 - 看看this post。

    【讨论】:

    • 哇哦,作为一名程序员,我还有很长的路要走。现在你向我展示了它是如何工作的,这看起来很合乎逻辑。谢谢你瓦西尔。我会投票给你,但我仍然没有这样做的声誉。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多