JsonConvert Предметы по заданному c полю - PullRequest
0 голосов
/ 21 марта 2020

Я хочу преобразовать Элементы API HackerNews с помощью Newtonsoft.

Я хотел бы взглянуть только на поле типа и затем преобразовать его в нужный элемент типа, поэтому я не буду у меня есть все поля во всех элементах.

Я хочу иметь возможность определить класс по типу и затем десериализовать.

Ответы [ 2 ]

2 голосов
/ 21 марта 2020

Имейте Сырое POCO с именем TypeIdentifier, у которого есть только Тип для идентификации только Типа, а затем используйте исходный POCO.

Используйте Быстрый Тип для преобразования любого JSON в C# Классы (POCO) и использование JsonConvert.Deserialize для десериализации того же самого.

public class HakernewsTypeIdentifier
{
    [JsonProperty("type")]
    public string Type { get; set; }
}

public class HakerNewsStory
{
    [JsonProperty("by")]
    public string By { get; set; }

    [JsonProperty("descendants")]
    public long Descendants { get; set; }

    [JsonProperty("id")]
    public long Id { get; set; }

    [JsonProperty("kids")]
    public long[] Kids { get; set; }

    [JsonProperty("score")]
    public long Score { get; set; }

    [JsonProperty("time")]
    public long Time { get; set; }

    [JsonProperty("title")]
    public string Title { get; set; }

    [JsonProperty("type")]
    public string Type { get; set; }

    [JsonProperty("url")]
    public Uri Url { get; set; }
}

// Use Libraries like RestSharp to fetch the Data
// Find the Type
var typeID = JsonConvert.DeserializeObject<HakernewsTypeIdentifier>(json);
// Deserialize once again based on the Type
if(typeID.type == "story")
    var story = JsonConvert.DeserializeObject<HakerNewsStory>(json);

Надеюсь, это поможет.

0 голосов
/ 21 марта 2020

Я не знаю, является ли это лучшим решением.

Код для десериализации

var item = JsonConvert.DeserializeObject<ItemType>(responseString);
switch (item.Type)
{
    case Type.Job:
        return JsonConvert.DeserializeObject<Job>(responseString);
    case Type.Story:
        return JsonConvert.DeserializeObject<Story>(responseString);
    case Type.Comment:
        return JsonConvert.DeserializeObject<Comment>(responseString);
    case Type.Poll:
        return JsonConvert.DeserializeObject<Poll>(responseString);
    case Type.PollOpt:
        return JsonConvert.DeserializeObject<PollOpt>(responseString);
    default:
        throw new ArgumentOutOfRangeException();
}

Все классы предметов

public class ItemType
{
    public Type Type { get; set; }
}

public enum Type
{
    None,
    Job,
    Story,
    Comment,
    Poll,
    PollOpt,
}

public interface IItem
{
}

public class Story : IItem
{
    public string By { get; set; }
    public long Descendants { get; set; }
    public long Id { get; set; }
    public List<long> Kids { get; set; }
    public long Score { get; set; }
    public long Time { get; set; }
    public string Title { get; set; }
    public string Type { get; set; }
    public Uri Url { get; set; }
}

public class Comment : IItem
{
    public string By { get; set; }
    public long Id { get; set; }
    public List<long> Kids { get; set; }
    public long Parent { get; set; }
    public string Text { get; set; }
    public long Time { get; set; }
    public string Type { get; set; }
}

public class Job : IItem
{
    public string By { get; set; }
    public long Id { get; set; }
    public long Score { get; set; }
    public string Text { get; set; }
    public long Time { get; set; }
    public string Title { get; set; }
    public string Type { get; set; }
    public string Url { get; set; }
}

public class Poll : IItem
{
    public string By { get; set; }
    public long Descendants { get; set; }
    public long Id { get; set; }
    public List<long> Kids { get; set; }
    public List<long> Parts { get; set; }
    public long Score { get; set; }
    public string Text { get; set; }
    public long Time { get; set; }
    public string Title { get; set; }
    public string Type { get; set; }
}

public class PollOpt : IItem
{
    public string By { get; set; }
    public long Id { get; set; }
    public long Poll { get; set; }
    public long Score { get; set; }
    public string Text { get; set; }
    public long Time { get; set; }
    public string Type { get; set; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...