使用无效键值访问JArray值

时间:2013-04-17 11:20:01

标签: c# json json.net

我在尝试挖掘json数据时遇到以下错误。

使用无效键值访问JArray值:“RateInfos”。预期数组位置索引。

任何人都可以帮助解决这个问题,我正在尝试获取currentAllotment:3的值,它是从json底部提供的15行。

customerSessionId: "0ABAA82A-4307-A913-E172-4D238D901107",
    numberOfRoomsRequested: 1,
    moreResultsAvailable: true,
    cacheKey: "-73d4307a:13e174d238d:-10fe",
    cacheLocation: "10.186.168.42:7301",
    cachedSupplierResponse: {
        @matchedLocale: "true",
        @matchedCurrency: "true",
        @tpidUsed: "5101",
        @otherOverheadTime: "1",
        @candidatePreptime: "98",
        @supplierResponseTime: "498",
        @supplierResponseNum: "1",
        @supplierRequestNum: "207",
        @cachedTime: "0",
        @supplierCacheTolerance: "NOT_SUPPORTED"
    },
    HotelList: {
        @activePropertyCount: "224",
        @size: "1",
        HotelSummary: {
            @ubsScore: "15815285",
            @order: "0",
            hotelId: 161395,
            name: "Larkspur Landing Bellevue - An All-Suite Hotel",
            address1: "15805 Se 37th St",
            city: "Bellevue",
            stateProvinceCode: "WA",
            postalCode: 98006,
            countryCode: "US",
            airportCode: "SEA",
            supplierType: "E",
            propertyCategory: 1,
            hotelRating: 3,
            confidenceRating: 95,
            amenityMask: 7823362,
            tripAdvisorRating: 4,
            tripAdvisorReviewCount: 81,
            tripAdvisorRatingUrl: "http://www.tripadvisor.com/img/cdsi/img2/ratings/traveler/4.0-12345-4.gif",
            locationDescription: "Near Bellevue College",
            shortDescription: "<p><b>Location. </b> <br />Located in Bellevue, Larkspur Landing Bellevue - An All-Suite Hotel is in the suburbs and close to Bellevue College, T-Mobile USA Headquarters, and Factoria Mall. Nearby",
            highRate: 64.45,
            lowRate: 51.56,
            rateCurrencyCode: "GBP",
            latitude: 47.57755,
            longitude: -122.13193,
            proximityDistance: 2.0668056,
            proximityUnit: "MI",
            hotelInDestination: true,
            thumbNailUrl: "/hotels/1000000/130000/127100/127040/127040_14_t.jpg",
            deepLink: "http://travel.ian.com/index.jsp?pageName=hotAvail&cid=55505&hotelID=161395&mode=2&numberOfRooms=1&room-0-adult-total=2&room-0-child-total=0&arrivalMonth=4&arrivalDay=17&departureMonth=4&departureDay=19&showInfo=true&locale=en_US&currencyCode=GBP",
            RoomRateDetailsList: {
                RoomRateDetails: {
                    roomTypeCode: 200207592,
                    rateCode: 201183732,
                    maxRoomOccupancy: 2,
                    quotedRoomOccupancy: 2,
                    minGuestAge: 0,
                    roomDescription: "Studio Suite Accessible",
                    propertyAvailable: true,
                    propertyRestricted: false,
                    expediaPropertyId: 127040,
                    RateInfos: {
                        @size: "1",
                        RateInfo: {
                            @rateChange: "false",
                            @promo: "true",
                            @priceBreakdown: "true",
                            RoomGroup: {
                                Room: {
                                    numberOfAdults: 2,
                                    numberOfChildren: 0,
                                    rateKey: "adbdfb1a-df03-4577-9970-ed62f4c84a17"
                                }
                            },
                            ChargeableRateInfo: {
                                @total: "117.14",
                                @surchargeTotal: "14.02",
                                @grossProfitOnline: "18.82",
                                @grossProfitOffline: "11.21",
                                @nightlyRateTotal: "103.12",
                                @maxNightlyRate: "51.56",
                                @currencyCode: "GBP",
                                @commissionableUsdTotal: "158.4",
                                @averageRate: "51.56",
                                @averageBaseRate: "64.45",
                                NightlyRatesPerRoom: {
                                    @size: "2",
                                    NightlyRate: {
                                        0: {
                                            @promo: "true",
                                            @rate: "51.56",
                                            @baseRate: "64.45"
                                        },
                                        1: {
                                            @promo: "true",
                                            @rate: "51.56",
                                            @baseRate: "64.45"
                                        }
                                    }
                                },
                                Surcharges: {
                                    @size: "1",
                                    Surcharge: {
                                        @amount: "14.02",
                                        @type: "TaxAndServiceFee"
                                    }
                                }
                            },
                            nonRefundable: false,
                            rateType: "MerchantStandard",
                            promoId: 202578064,
                            promoDescription: "Sale! Save 20% on this Stay.",
                            promoType: "Standard",
                            currentAllotment: 3
                        }
                    },
                    ValueAdds: {
                        @size: "1",
                        ValueAdd: {
                            @id: "1024",
                            description: "Free High-Speed Internet"
                        }
                    }
                }
            }
        }
    }
}

抛出错误的代码行。

IList<JToken> rates = root["HotelListResponse"]["HotelList"]["HotelSummary"]["RateInfos"]["RateInfo"].Children().Values().ToList();

如果有人能够向我展示一种比我正在深入研究json数据所做的更好的方式,我将不胜感激。

由于 乔治

1 个答案:

答案 0 :(得分:2)

此JSON中没有数组。您应该使用JToken.Parse()来解析它。然后,您可以使用SelectToken来提取所需的值:

JToken token = JToken.Parse(json);

int currentAllotment = 
    token.SelectToken("HotelList.HotelSummary.RoomRateDetailsList.RoomRateDetails.RateInfos.RateInfo.currentAllotment")
         .Value<int>();

小提琴:https://dotnetfiddle.net/TFKpq5