将json数据反序列化为c#中的列表

时间:2017-02-28 11:23:04

标签: c# json asp.net-web-api2

我正在调用外部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有房型详细信息。

2 个答案:

答案 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/