【问题标题】:How would I safely get these JSON values from an API response if I don't know the keys?如果我不知道密钥,如何从 API 响应中安全地获取这些 JSON 值?
【发布时间】:2011-04-16 23:25:28
【问题描述】:

示例响应:

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

我不知道电影是否会有 dvd、vhs、betamax 或蓝光版本。正因为如此,我无法硬编码可用的类型,并在所有地方放置 try catch 来检查它是否存在。我宁愿通过首先获取可用类型来正确地做到这一点,然后获取可用类型的值。

这是我目前所拥有的,使用 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; }
}

【问题讨论】:

    标签: c# json json.net


    【解决方案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);
    }
    

    【讨论】:

      【解决方案2】:

      假设值始终是 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"]);
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2013-05-23
        • 2016-12-21
        • 1970-01-01
        • 2023-03-05
        • 1970-01-01
        • 2018-06-26
        • 2016-03-14
        • 2023-03-22
        • 1970-01-01
        相关资源
        最近更新 更多