rah*_*rma 4 c# api json web-services user-defined-types
我正在使用一个Web服务,它以下列格式将数据返回到JSON
{
"responseId": 2933574,
"availableHotels": [
{
"processId": "HC-65870953",
"hotelCode": "UKI9E6",
"availabilityStatus": "InstantConfirmation",
"totalPrice": 971,
"totalTax": 0,
"totalSalePrice": 0,
"currency": "EUR",
"boardType": "Bed & Continental Breakfast",
"rooms": [
{
"roomCategory": "Triple Room",
"paxes": [
{
"paxType": "Adult",
"age": 30
},
{
"paxType": "Adult",
"age": 30
},
{
"paxType": "Child",
"age": "6"
}
],
"totalRoomRate": 486,
"ratesPerNight": [
{
"date": "2012-07-20",
"amount": 163
},
{
"date": "2012-07-21",
"amount": 163
},
{
"date": "2012-07-22",
"amount": 160
},
{
"date": "2012-07-23",
"amount": 0
}
]
},
{
"roomCategory": "Triple Room",
"paxes": [
{
"paxType": "Adult",
"age": 30
},
{
"paxType": "Adult",
"age": 30
},
{
"paxType": "Child",
"age": "8"
}
],
"totalRoomRate": 485,
"ratesPerNight": [
{
"date": "2012-07-20",
"amount": 163
},
{
"date": "2012-07-21",
"amount": 163
},
{
"date": "2012-07-22",
"amount": 160
},
{
"date": "2012-07-23",
"amount": -1
}
]
}
]
},
{
"processId": "HH-22003963",
"hotelCode": "UKPDNN",
"availabilityStatus": "InstantConfirmation",
"totalPrice": 1085,
"totalTax": 0,
"totalSalePrice": 0,
"currency": "EUR",
"boardType": "Bed and Breakfast",
"rooms": [
{
"roomCategory": "Triple Room",
"paxes": [
{
"paxType": "Adult",
"age": 30
},
{
"paxType": "Adult",
"age": 30
},
{
"paxType": "Child",
"age": "6"
}
],
"totalRoomRate": 544,
"ratesPerNight": [
{
"date": "2012-07-20",
"amount": 136
},
{
"date": "2012-07-21",
"amount": 136
},
{
"date": "2012-07-22",
"amount": 136
},
{
"date": "2012-07-23",
"amount": 136
}
]
},
{
"roomCategory": "Triple Room",
"paxes": [
{
"paxType": "Adult",
"age": 30
},
{
"paxType": "Adult",
"age": 30
},
{
"paxType": "Child",
"age": "8"
}
],
"totalRoomRate": 541,
"ratesPerNight": [
{
"date": "2012-07-20",
"amount": 136
},
{
"date": "2012-07-21",
"amount": 136
},
{
"date": "2012-07-22",
"amount": 136
},
{
"date": "2012-07-23",
"amount": 133
}
]
}
]
}
],
"totalFound": 2,
"searchId": "QG-67623913"
}
Run Code Online (Sandbox Code Playgroud)
现在我有一个类定义如下:
public class getAvailableHotelResponse
{
public getAvailableHotelResponse();
public hotel[] availableHotels { get; set; }
[SoapElement(DataType = "integer")]
public string responseId { get; set; }
public string searchId { get; set; }
[SoapElement(DataType = "integer")]
public string totalFound { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
而hotel等级如下表所示:
public class hotel
{
public hotel();
public string availabilityStatus { get; set; }
public string boardType { get; set; }
public string currency { get; set; }
public string hotelCode { get; set; }
public string processId { get; set; }
public roomResponse[] rooms { get; set; }
[SoapElement(DataType = "integer")]
public string specialDeal { get; set; }
public float totalPrice { get; set; }
[SoapIgnore]
public bool totalPriceSpecified { get; set; }
public float totalSalePrice { get; set; }
[SoapIgnore]
public bool totalSalePriceSpecified { get; set; }
public float totalTax { get; set; }
[SoapIgnore]
public bool totalTaxSpecified { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
而roomResponse等级如下表所示:
public class roomResponse
{
public roomResponse();
public pax[] paxes { get; set; }
public dailyRate[] ratesPerNight { get; set; }
public string roomCategory { get; set; }
public float totalRoomRate { get; set; }
[SoapIgnore]
public bool totalRoomRateSpecified { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
和pax等级如下表所示:
public class pax
{
public pax();
[SoapElement(DataType = "integer")]
public string age { get; set; }
public string firstName { get; set; }
public string lastName { get; set; }
public string paxType { get; set; }
public string title { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
和dailyRate等级如下表所示:
public class dailyRate
{
public dailyRate();
public float amount { get; set; }
[SoapIgnore]
public bool amountSpecified { get; set; }
[SoapElement(DataType = "date")]
public DateTime date { get; set; }
[SoapIgnore]
public bool dateSpecified { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
编辑
getAvailableHotelResponse h = new getAvailableHotelResponse();
h = (getAvailableHotelResponse)Newtonsoft.Json.JsonConvert.DeserializeObject(text);
Run Code Online (Sandbox Code Playgroud)
我试过这个,它抛出以下错误:
无法将"Newtonsoft.Json.Linq.JObject"类型的对象强制转换为"hotelspro.getAvailableHotelResponse".
有一个非常复杂的JSON结构,所以如何将其转换为我的对象?
删除不可编译的构造函数public pax();,只需使用
var availHotels = JsonConvert.DeserializeObject<getAvailableHotelResponse>(text);
Run Code Online (Sandbox Code Playgroud)
就这样.
事实上,你甚至不会需要声明这串类(getAvailableHotelResponse,hotel,roomResponse,pax,dailyRate等),如果你利用的动态.对于前者,
dynamic response = Newtonsoft.Json.JsonConvert.DeserializeObject(text);
foreach (var hotel in response.availableHotels)
{
Console.WriteLine(hotel.processId);
foreach (var room in hotel.rooms)
{
Console.WriteLine("\t" + room.roomCategory);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1486 次 |
| 最近记录: |