Есть некий объект:
{
"time": "4ms",
"total": 14709,
"prev_page": null,
"next_page": "/list?page=bk7PjN0b",
"results": [
{
"id": "serial-6590",
"type": "anime-serial",
"link": "/serial/6590/a8WA9Rff799ee0",
"title": "Мина - оружие Луны",
"title_orig": "Getsumento Heiki Mina",
"other_title": "月面兎兵器ミーナ",
"translation": {
"id": 609,
"title": "AniDUB"
},
"year": 2007,
"last_season": 1,
"last_episode": 11,
"episodes_count": 11,
"kinopoisk_id": "630152",
"imdb_id": "tt1990559",
"worldart_link": "/animation/animation.php?id=5786",
"quality": "HDTVRip 720p",
"camrip": false,
"blocked_countries": [],
"blocked_seasons": {},
"created_at": "2017-11-26T00:16:25Z",
"updated_at": "2019-12-06T14:14:20Z",
"seasons": {
"1": {
"link": "/season/31300/a8WA9R00604a0b",
"episodes": {
"1": "/episode/175372/a8WA9R00604a0b",
"2": "/episode/175373/a8WA9Rd38bfcf3",
"3": "/episode/175374/a8WA9R4b8e88c4",
"4": "/episode/175375/a8WA9R52394376",
"5": "/episode/175376/a8WA9Rfe205eb3",
"6": "/episode/175377/a8WA9Rc4f56569",
"7": "/episode/175378/a8WA9R5cb3a446",
"8": "/episode/175379/a8WA9R7ab36b8a",
"9": "/episode/175380/a8WA9R9a9b05b8",
"10": "/episode/175381/a8WA9R00ffc2db",
"11": "/episode/175382/a8WA9R2986d187"
}
}
},
"material_data": {
"title": "Мина – оружие Луны",
"title_en": "Getsumen To Heiki Mina",
"year": 2007,
"poster_url": "/images/film_iphone/iphone360_630152.jpg",
"duration": 23,
"countries": [
"Япония"
],
"genres": [
"аниме",
"мультфильм",
"комедия",
"фантастика"
],
"imdb_rating": 5.6,
"imdb_votes": 11,
"premiere_world": "2007-01-13",
"actors": [
"Мария Иноэ",
"Сидзука Ито",
"Хироки Тоути"
],
"directors": [
"Кэйитиро Кавагути"
]
}
}
]
}
И мне необходимо перевести объект seasons
как словарь IDictionary<uint, ISeason>
.
[JsonConverter(typeof(KodikSeasonConverter))]
public interface ISeason
{
Uri Link { get; }
IDictionary<uint, Uri> Episodes { get; }
}
[JsonConverter(typeof(KodikMaterialConverter))]
public interface IMaterial
{
string Id { get; }
string Type { get; }
Uri Link { get; }
string Title { get; }
string OriginalTitle { get; }
string OtherTitle { get; }
ITranslation Translation { get; }
uint Year { get; }
uint LastSeason { get; }
uint LastEpisode { get; }
uint EpisodesCount { get; }
long KpId { get; }
string ImDbId { get; }
Uri WorldArtLink { get; }
string Quality { get; }
bool IsCamRip { get; }
IDictionary<uint, ISeason> Seasons { get; }
DateTimeOffset CreatedAt { get; }
DateTimeOffset UpdatedAt { get; }
IMaterialData MaterialData { get; }
}
Конвертер:
internal class KodikMaterialConverter : JsonConverter<IMaterial>
{
public override void WriteJson(JsonWriter writer, IMaterial value, JsonSerializer serializer)
{
serializer.Serialize(writer, value, typeof(KodikMaterialRaw));
}
public override IMaterial ReadJson
(
JsonReader reader,
Type objectType,
IMaterial existingValue,
bool hasExistingValue,
JsonSerializer serializer
)
{
if (reader.TokenType != JsonToken.StartObject)
{
throw new InvalidCastException();
}
return (KodikMaterial)serializer.Deserialize<KodikMaterialRaw>(reader);
}
}
Модели:
internal class KodikMaterialRaw
{
[JsonProperty("id")] public string Id { get; internal set; }
[JsonProperty("type")] public string Type { get; internal set; }
[JsonProperty("link")] public Uri Link { get; internal set; }
[JsonProperty("title")] public string Title { get; internal set; }
[JsonProperty("title_orig")] public string OriginalTitle { get; internal set; }
[JsonProperty("other_title")] public string OtherTitle { get; internal set; }
[JsonProperty("translation")] public ITranslation Translation { get; internal set; }
[JsonProperty("year")] public uint Year { get; internal set; }
[JsonProperty("last_season")] public uint LastSeason { get; internal set; }
[JsonProperty("last_episode")] public uint LastEpisode { get; internal set; }
[JsonProperty("episodes_count")] public uint EpisodesCount { get; internal set; }
[JsonProperty("kinopoisk_id")] public long KpId { get; internal set; }
[JsonProperty("imdb_id")] public string ImDbId { get; internal set; }
[JsonProperty("worldart_link")] public Uri WorldArtLink { get; internal set; }
[JsonProperty("quality")] public string Quality { get; internal set; }
[JsonProperty("camrip")] public bool IsCamRip { get; internal set; }
[JsonProperty("seasons", NullValueHandling = NullValueHandling.Ignore)]
public IDictionary<uint, ISeason> Seasons { get; internal set; }
[JsonProperty("created_at")] public DateTimeOffset CreatedAt { get; internal set; }
[JsonProperty("updated_at")] public DateTimeOffset UpdatedAt { get; internal set; }
[JsonProperty("material_data")] public IMaterialData MaterialData { get; internal set; }
}
internal class KodikSeason : ISeason
{
internal KodikSeason(KodikSeasonRaw raw)
{
Link = raw.Link;
Episodes = raw.Episodes;
}
public Uri Link { get; }
public IDictionary<uint, Uri> Episodes { get; }
public static implicit operator KodikSeason(KodikSeasonRaw raw)
{
return new KodikSeason(raw);
}
}
Но я в итоге получаю всегда пустой ISeason
, т.е. объект есть, но все данные в нем null
. Как правильно перевести это дело в объект?
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Как то можно саму инициализацию объектов переписать в меньшое количество строк?
Могу ли я создавать элементы визуального интерфейса в MVVM? Допустим у меня по нажатию кнопки "+" появляется еще один TextBoxКак это прописать во VM?
Необходимо убрать слово+символ "- Неисправности" из генерации тега посредством PHPТоварищи-вебмастеры, как можно это осуществить?
на одной странице есть форма добавление и сразу же отображение результата у виде таблицы, отображение идет с помощью ajax, в консоле в строке...