我正在使用一个 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"
}
现在我有一个定义如下的类:
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; }
}
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; }
}
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; }
}
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; }
}
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; }
}
编辑
getAvailableHotelResponse h = new getAvailableHotelResponse();
h = (getAvailableHotelResponse)Newtonsoft.Json.JsonConvert.DeserializeObject(text);
我试过这个,它抛出以下错误:
JSON 的结构非常复杂,那么如何将其转换为我的对象?
最佳答案
删除不可编译的构造函数,如 public pax();
并使用
var availHotels = JsonConvert.DeserializeObject<getAvailableHotelResponse>(text);
就这样。
事实上,如果您使用 dynamic ,您甚至不需要声明这一堆类(
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);
}
}
关于c# - 如何将这种类型的 json 响应转换为用户定义的类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11495896/