2013-04-17 39 views
0

尝试挖掘json数据时出现以下错误。使用无效键值访问JArray值

使用无效键值访问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(); 

将不胜感激,如果有人也可以告诉我一个eaiser的方式比我正在做的深入到json数据。

感谢 乔治

+0

好像它抱怨RateInfos是一个JArray你尝试的IList 率=根[“HotelListResponse”] [” HotelList “] [” HotelSummary “] [” RateInfos “] [0] [” RateInfo“]儿童()的值()ToList()。;当然,这只会让你获得第一个RateInfo。至于更好的访问数据的方式,我不知道类似xml的任何类型的后代类型对json的支持。 – cgotberg

+0

嗨cgotberg是的,试过了,我读过的书以及我在网上阅读的信息都说json数组被[]包围,但没有数据有方括号,所以它为什么会抱怨数组索引。我对切换回xml有认真的想法,对我来说这很容易 – CareerChange

+0

再次看看JSON它可能是问题是你排除这一层层次结构RoomRateDetailsList:{RoomRateDetails:{。您可以尝试使用IList rates = root [“HotelListResponse”] [“HotelList”] [“HotelSummary”] [“RoomRateDetailsList”] [“RoomRateDetails”] [“RateInfos”] [“RateInfo”]。Children()。Values ).ToList();理想情况下,这是一个非常复杂的对象,将其反序列化为合适的对象。 – cgotberg

回答

1

有这个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