我正在调用外部Web服务,这是我在发布到他们的服务器后得到的响应:
{
"status":200,
"data":{
"h21":{
"total_price":{
"acacia":{
"available":0,
"price":null,
"availability":false
},
"maple":{
"available":7,
"price":2399.0,
"availability":true
}
}
},
"h17":{
"total_price":{
"mahogany":{
"available":1,
"price":1899.0,
"availability":true
},
"oak":{
"available":0,
"price":null,
"availability":false
},
"maple":{
"available":6,
"price":1649.0,
"availability":true
}
}
}
}
}
我希望将此响应转换为列表。我使用jsontocsharp在线转换器生成类并使用下面的代码:
var Jsonresult = JsonConvert.DeserializeObject<Sstageback.Models.Sstage.treeboRoomTypes.RootObject>(JsonReplace);
但事情是我的是一个动态的JSON响应,可以随着时间的推移而改变。
注意:我从服务器获得的响应是酒店及其房间可用性,因此在生成课程时我无法使用单个课程文件生成,因为酒店ID可能也会更改房间类型,其可用性也会发生变化。 / p>
示例:h21是一个酒店ID,total_price有房间类型详情,h17是下一个酒店,total_price有房型详细信息。
答案 0 :(得分:3)
基本上,TotalPrice
应为Dictionary<string, Availability>
或类似。目前还不清楚你有什么 list ,但这自然是一本字典。然后它嵌套在顶层的字典中。
示例代码:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Newtonsoft.Json;
public class Response
{
public int Status { get; set; }
public Dictionary<string, Hotel> Data { get; set; }
}
public class Hotel
{
[JsonProperty("total_price")]
public Dictionary<string, Room> TotalPrice { get; set; }
}
public class Room
{
public int Available { get; set; }
public decimal? Price { get; set; }
public bool Availability { get; set; }
}
class Test
{
static void Main(string[] args)
{
var text = File.ReadAllText("test.json");
var response = JsonConvert.DeserializeObject<Response>(text);
foreach (var pair in response.Data)
{
Console.WriteLine($"Key: {pair.Key}");
foreach (var nestedPair in pair.Value.TotalPrice)
{
var room = nestedPair.Value;
Console.WriteLine($" {nestedPair.Key}: {room.Available}/{room.Price}/{room.Availability}");
}
}
}
}
输出:
Key: h21
acacia: 0//False
maple: 7/2399.0/True
Key: h17
mahogany: 1/1899.0/True
oak: 0//False
maple: 6/1649.0/True
答案 1 :(得分:0)
您需要制作与响应相对应的DTO模型。只要类型保持不变(int保持为int且字符串保持字符串),属性的值就可以改变,这没有问题。
您的对象可能如下所示:
public class Room{
public int Available { get; set;}
public int Price { get; set; }
public bool availability { get; set; }
}
public class Hotel{
public string Name { get; set; }
public List<Room> Rooms { get; set; }
}
您应该转换序列化和反序列化。这只是一个示例,您希望您的模型与您的JSON 100%相同。
为了在Models和DTO之间轻松转换,您可以使用AutoMapper:http://automapper.org/