2013-04-17 40 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