2011-04-16 64 views
0

示例響應:如果我不知道密鑰,我將如何安全地從API響應中獲取這些JSON值?

"release_dates": { 
    "theater": "1939-12-15", 
    "dvd": "2000-03-07" 
}, 

我不知道,如果一部電影將有一個DVD,VHS,Betamax錄像機或藍光版本。正因爲如此,我不能硬編碼哪些類型可用,並嘗試在各處檢查是否存在或不存在。我寧願這樣做,通過首先獲得可用類型,然後獲取可用類型的值。

這裏是我到目前爲止,使用JSON.Net庫:

var releaseDates = (JArray) x["release_dates"]; 
foreach (var releaseDate in releaseDates) 
{ 
    ReleaseDate date = new ReleaseDate() 
          { 
           Type = releaseDate 
          } 
} 

有沒有辦法讓鍵名,和值名稱?

ReleaseDate類有以下幾點:

public class ReleaseDate 
{ 
    public string Type { get; set; } 
    public DateTime Date { get; set; } 
} 

回答

1

這裏是你如何做到這一點:

var dates = (JObject)x["release_dates"]; 
foreach (var date in dates) 
{ 
    ReleaseDate releaseDate = new ReleaseDate(); 

    releaseDate.Type = (string)date.Key; 

    var tmpDate = ((string) date.Value).Substring(0, ((string) date.Value).Count()); 
    releaseDate.Date = DateTime.Parse(tmpDate); 

    movie.ReleaseDates.Add(releaseDate); 
} 
0

假設值是DateTime類型始終是另一種方法是直接反序列化到詞典,例如

using System; 
using System.Collections.Generic; 
using NUnit.Framework; 
using Newtonsoft.Json; 

namespace JsonNET 
{ 
    [TestFixture] 
    public class JsonNetExamples 
    { 
     class ReleaseDateCollection 
     { 
      [JsonProperty(PropertyName = "release_dates")] 
      public Dictionary<string, DateTime> ReleaseDates { get; set; } 
     } 

     [Test] 
     public void DerializeReleaseDateCollection() 
     { 
      const string json = @"{""release_dates"":{""theater"": ""1939-12-15"",""dvd"": ""2000-03-07"",""bluray"": ""1977-05-25""}}"; 
      var collection = JsonConvert.DeserializeObject<ReleaseDateCollection>(json); 
      Assert.AreEqual(new DateTime(1939, 12, 15), collection.ReleaseDates["theater"]); 
      Assert.AreEqual(new DateTime(2000, 3, 7), collection.ReleaseDates["dvd"]); 
      Assert.AreEqual(new DateTime(1977, 5, 25), collection.ReleaseDates["bluray"]); 
     } 
    } 
} 
相關問題