Сериализация объекта по условию - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть следующие JSON

{"id":"154298_child","design":{"id":154298,"alias":"SOME NAME","published_at":"2013-02-04T00:00:00+0400","author":[]} }

и этот

{"id":"292171_manshort","design":{"id":292171,"alias":"some name2","published_at":"2014-04-08T00:00:00+0400","author":{"nickname":"Malkia"}}}

Чем я десериализую их на объект

public class Data
{
    public string id { get; set; }
    public Design design { get; set; }
}
public class Design
{
    public int id { get; set; }
    public string alias { get; set; }
    public DateTime published_at { get; set; }
    [JsonConverter(typeof(SingleOrArrayConverter<Author>))]
    public List<Author> author { get; set; }
}

с преобразователем

class SingleOrArrayConverter<T> : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(List<T>));
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        JToken token = JToken.Load(reader);
        if (token.Type == JTokenType.Array)
        {
            return token.ToObject<List<T>>();
        }
        return new List<T> { token.ToObject<T>() };
    }

    public override bool CanWrite
    {
        get { return false; }
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

Вопрос: Как сериализовать объект по условию
if (Author.Count> 1) => затем второй пример json (для объекта)
if (Author.Count == 0) => затем первый пример json (в массив)

1 Ответ

0 голосов
/ 05 сентября 2018

Ты почти у цели.

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
    List<Author> list = value as List<Author>;
    int count = list?.Count ?? 0;

    JToken t;

    // count > 1 ?
    if (count >= 1)
    {
        t = JToken.FromObject(list[0]);
    }
    else
    {
        t = JToken.FromObject(new List<Author>());
    }

    t.WriteTo(writer);
}

Не забудьте установить CanWrite в true

public override bool CanWrite
{
    get { return true; }
}
...