Как мне безопасно получить эти значения JSON из ответа API, если я не знаю ключей? - PullRequest
0 голосов
/ 17 апреля 2011

Пример ответа:

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

Я не знаю, будет ли у фильма выпуск DVD, VHS, бета-макс или Blu-Ray.Из-за этого я просто не могу жестко закодировать, какие типы доступны, и поставить попробовать ловит повсюду, проверяя, есть ли он или нет.Я бы предпочел сделать это правильно, сначала получая доступные типы, , а затем получая значения для доступных типов.

Вот что у меня есть, используя библиотеку 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; }
}

Ответы [ 2 ]

1 голос
/ 17 апреля 2011

Вот как вы это делаете:

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 голосов
/ 17 апреля 2011

Предполагая, что значения всегда имеют тип 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"]);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...