asp.net用于接收具有复杂集合的复杂json的操作

时间:2017-01-24 14:31:43

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

这很难:基本上我想将一个复杂的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>所有合同都是IContract的类型。但这并不奏效。

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

1 个答案:

答案 0 :(得分: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