【问题标题】:Get selected values of JSON response c#获取 JSON 响应 c# 的选定值
【发布时间】:2017-08-14 23:23:40
【问题描述】:

我是 JSON 新手,我需要从 JSON 响应中获取选定的值。根据我已经进行的一些研究,我创建了一个如下所示的 POCO;

public class RatesResponse
{
    public class Hotel
    {
        public int hotel_id { get; set; }
        public RoomTypes room_types { get; set; }
    }

    public class RoomTypes
    {
        [JsonExtensionData]
        public Dictionary<string, object> rooms { get; set; }
    }

    public class RatesResponseObject
    {
        public List<Hotel> hotels { get; set; }
    }       
}

下面的 JSON 响应是我正在使用的示例;

{
    "hotels": [
        {
            "hotel_id": 0,
            "room_types": {
                "Superior Suite Long Stay Offer - test": {
                    "url": "https://hoteltest.cosmores.com/?CHECK_IN_DATE=2017-08-20&CHECK_OUT_DATE=2017-08-31&PERSONS=2&ROOMS=3924&CURRENCY=EUR&ref=tripads",
                    "price": 1685,
                    "fees": 0,
                    "fees_at_checkout": 0,
                    "taxes": 229,
                    "taxes_at_checkout": 0,
                    "final_price": 1914,
                    "num_rooms": 1,
                    "currency": "EUR",
                    "room_amenities": [
                        "BATHROOMS",
                        "BEACH",
                        "TENNIS_COURT",
                        "SWIMMING_POOL",
                        "FITNESS_CENTER",
                        "RESTAURANT",
                        "STAIRS_ELEVATOR",
                        "BED_AND_BREAKFAST",
                        "CREDIT_CARDS_ACCEPTED"
                    ],
                    "discounts": [
                        {
                            "marketing_text": "--MANOS-OFFER--",
                            "is_percent": true,
                            "amount": 13,
                            "price": 251.838154361,
                            "fees": 0,
                            "fees_at_checkout": 0,
                            "taxes": 34.1618456391,
                            "taxes_at_checkout": 0,
                            "final_price": 286
                        }
                    ]
                },
                "Superior Double Room Long Stay Offer - test": {
                    "url": "https://hoteltest.cosmores.com/?CHECK_IN_DATE=2017-08-20&CHECK_OUT_DATE=2017-08-31&PERSONS=2&ROOMS=5385&CURRENCY=EUR&ref=tripads",
                    "price": 1213,
                    "fees": 0,
                    "fees_at_checkout": 0,
                    "taxes": 165,
                    "taxes_at_checkout": 0,
                    "final_price": 1378,
                    "num_rooms": 1,
                    "currency": "EUR",
                    "room_amenities": [
                        "BEACH",
                        "TENNIS_COURT",
                        "SWIMMING_POOL",
                        "FITNESS_CENTER",
                        "RESTAURANT",
                        "STAIRS_ELEVATOR",
                        "BED_AND_BREAKFAST",
                        "CREDIT_CARDS_ACCEPTED"
                    ],
                    "discounts": [
                        {
                            "marketing_text": "--MANOS-OFFER--",
                            "is_percent": true,
                            "amount": 13,
                            "price": 181.32347114,
                            "fees": 0,
                            "fees_at_checkout": 0,
                            "taxes": 24.5965288601,
                            "taxes_at_checkout": 0,
                            "final_price": 205.92
                        }
                    ]
                },
                "Superior Double with Sea View Long Stay Offer - test": {
                    "url": "https://hoteltest.cosmores.com/?CHECK_IN_DATE=2017-08-20&CHECK_OUT_DATE=2017-08-31&PERSONS=2&ROOMS=5386&CURRENCY=EUR&ref=tripads",
                    "price": 1011,
                    "fees": 0,
                    "fees_at_checkout": 0,
                    "taxes": 137,
                    "taxes_at_checkout": 0,
                    "final_price": 1148,
                    "num_rooms": 1,
                    "currency": "EUR",
                    "room_amenities": [
                        "BEACH",
                        "TENNIS_COURT",
                        "SWIMMING_POOL",
                        "FITNESS_CENTER",
                        "RESTAURANT",
                        "STAIRS_ELEVATOR",
                        "BED_AND_BREAKFAST",
                        "CREDIT_CARDS_ACCEPTED"
                    ],
                    "discounts": [
                        {
                            "marketing_text": "--MANOS-OFFER--",
                            "is_percent": true,
                            "amount": 13,
                            "price": 151.102892617,
                            "fees": 0,
                            "fees_at_checkout": 0,
                            "taxes": 20.4971073834,
                            "taxes_at_checkout": 0,
                            "final_price": 171.6
                        }
                    ]
                }
            }
        }
    ]
}

我需要获取的字段是;

  • hotel_id
  • 房间名称(即高级套房长期住宿优惠 - 测试)
  • final_price
  • num_rooms

任何帮助将不胜感激,因为我已经看了 2 天了!

【问题讨论】:

  • 你说的是javascript吗?
  • @Steve,不,我没有使用 javascript。
  • @Dave,在你 JSON 中“Superior Suite Long Stay Offer - test”是属性名称,我认为在 C# 中拥有带有空格的对象属性可能是个问题,是否可以将其更改为:"room_types": { "typeName": "Superior Suite Long Stay Offer - test", "url": "https://hoteltest.cosmores.com/?CHECK_IN_DATE=2017-08-20&amp;CHECK_OUT_DATE=2017-08-31&amp;PERSONS=2&amp;ROOMS=3924&amp;CURRENCY=EUR&amp;ref=tripads", "price": 1685,?我看到您正在尝试将其解析为 Dictionaty,但如果您更改 JSON,则获取必要的字段会简单得多
  • @ViktorOleksyshyn 不,我无法更改它,因为它来自供应商,所以我不得不使用他们提供给我的东西

标签: c# json


【解决方案1】:

您可以使用Newtonsoft.Json。 这里没有异常处理的例子:

var str = "PUT_YOUR_JSON_HERE";
        var hotelData = JsonConvert.DeserializeObject<RatesResponseObject>(str);
        foreach (var hotel in hotelData.hotels)
        {
            var id = hotel.hotel_id;
            var rooms = hotel.room_types.ToList();
                foreach (var room in rooms)
            {
                var roomName = ((JProperty)(room)).Name;
                var roomDetails = JsonConvert.DeserializeObject<RoomDetails>(room.First.ToString());

                var finalPrice = roomDetails.final_price;
                var num_rooms = roomDetails.num_rooms;
            }

        }

和类:

    public class Hotel
{
    public int hotel_id { get; set; }
    public JToken room_types { get; set; }
}

public class RatesResponseObject
{
    public List<Hotel> hotels { get; set; }
}

public class RoomDetails
{
    public int final_price { get; set; }
    public int num_rooms { get; set; }
}

【讨论】:

  • 感谢您,它完美运行!非常感谢
【解决方案2】:

你在正确的轨道上,但你需要稍微调整你的班级结构。特别是,您需要定义一个RoomType 类,然后将Hotel 类中的room_types 属性更改为Dictionary&lt;string, RoomType&gt;。然后,您可以删除 RoomTypes(复数)类。如果您想获取折扣信息,您还需要定义一个Discount 类。下面是最终结构的样子:

public class RatesResponseObject
{
    public List<Hotel> hotels { get; set; }
}

public class Hotel
{
    public int hotel_id { get; set; }
    public Dictionary<string, RoomType> room_types { get; set; }
}

public class RoomType
{
    public string url { get; set; }
    public decimal price { get; set; }
    public decimal fees { get; set; }
    public decimal fees_at_checkout { get; set; }
    public decimal taxes { get; set; }
    public decimal taxes_at_checkout { get; set; }
    public decimal final_price { get; set; }
    public int num_rooms { get; set; }
    public string currency { get; set; }
    public List<string> room_amenities { get; set; }
    public List<Discount> discounts { get; set; }
}

public class Discount
{
    public string marketing_text { get; set; }
    public bool is_percent { get; set; }
    public decimal amount { get; set; }
    public decimal price { get; set; }
    public decimal fees { get; set; }
    public decimal fees_at_checkout { get; set; }
    public decimal taxes { get; set; }
    public decimal taxes_at_checkout { get; set; }
    public decimal final_price { get; set; }
}

假设您使用的是Json.Net,那么您可以像这样反序列化并提取您想要的数据:

var rro = JsonConvert.DeserializeObject<RatesResponseObject>(json);

foreach (Hotel hotel in rro.hotels)
{
    Console.WriteLine("Hotel ID: " + hotel.hotel_id);
    Console.WriteLine();

    foreach (var kvp in hotel.room_types)
    {
        Console.WriteLine("Room Type: " + kvp.Key);
        Console.WriteLine("Number of Rooms: " + kvp.Value.num_rooms);
        Console.WriteLine("Final Price: " + kvp.Value.final_price);
        Console.WriteLine();
    }
}

演示小提琴:https://dotnetfiddle.net/wpRUzL

【讨论】:

  • 感谢@BrianRogers
  • 没问题;很乐意提供帮助。
  • 我更喜欢这个解决方案,因为建议的类结构类型更强,并且可能更接近生成 json 响应的原始数据结构。达到较低级别的 json 解析流人工制品感觉就像是最后的手段。
【解决方案3】:

您可以使用 Newtonsoft 的 JObject。非常适合 JSON。

您的案例的示例用法如下:

JObject myJson = JObject.Parse(jsonFromYourExample);
//now to access whatever you need, you simply do
foreach(var o in myJson["hotels"])
{
    Debug.WriteLine(o["hotel_id"]);
    // and so on depending on what level you are in
}

这应该让您开始使用 JSON。您可以阅读有关 JObject Here 的更多信息。

希望这会有所帮助!

【讨论】:

  • 谢谢你的建议,我试试看。
猜你喜欢
  • 1970-01-01
  • 2020-12-13
  • 1970-01-01
  • 1970-01-01
  • 2013-08-02
  • 2022-06-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多