Newtonsoft Json.NET Игнорирование члена во время выполнения в конвертере Json или вызов JsonConverter SerializeObject - PullRequest
0 голосов
/ 29 сентября 2018

Допустим, у меня есть следующий пользовательский JsonConverter для сериализации и / или десериализации:

public class VersionConverter : JsonConverter<Version>
{
    public override void WriteJson(JsonWriter writer, Version value, JsonSerializer serializer)
    {
        writer.WriteValue(value.ToString());
    }

    public override Version ReadJson(JsonReader reader, Type objectType, Version existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        string s = (string)reader.Value;

        return new Version(s);
    }
}

public class NuGetPackage
{
    public string PackageId { get; set; }
    public Version Version { get; set; }
    public string Description { get; set; }
}

Допустим, у меня есть следующий фрагмент кода в моем приложении:

NuGetPackage p1 = new NuGetPackage
{
    PackageId = "Newtonsoft.Json",
    Version = new Version(10, 0, 4),
    Description = null
};
string json = JsonConvert.SerializeObject(p1, Formatting.Indented, new VersionConverter());

Я хочупреобразователь Json.NET для игнорирования переменной-члена Description класса NuGetPackage.

Примечание: я не хочу использовать следующую переменную-член "marker boolean":

public bool ShouldSerializeINSERT_YOUR_PROPERTY_NAME_HERE()
{
    if(someCondition){
        return true;
    }else{
        return false;
    }
}

Я бы предпочел указать где-то игнорирование определенной переменной-члена

a) когда мой код вызывает JsonConvert.SerializeObject?

b) или внутри самого класса кода VersionConverter?

Может кто-нибудь показать мне, как игнорировать определенный членпеременная таким образом?

1 Ответ

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

Поскольку NuGetPackage довольно просто, вы можете просто написать дополнительный JsonConverter для NuGetPackage, который сериализует только те элементы, которые вам нужны, например:

public class SimplifiedNuGetPackageConverter : JsonConverter
{
    public override bool CanConvert(Type objectType) { return objectType == typeof(NuGetPackage); }

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

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var package = (NuGetPackage)value;
        serializer.Serialize(writer, new { package.PackageId, package.Version });
    }
}

Затем сериализовать следующим образом:

var settings = new JsonSerializerSettings
{
    Converters = { new VersionConverter() },
};
if (!someCondition)
    settings.Converters.Add(new SimplifiedNuGetPackageConverter());
var json = JsonConvert.SerializeObject(p1, Formatting.Indented, settings);      

Если вы сериализуете несколько экземпляров NuGetPackage одновременно и вам нужно написать Description для некоторых, но не для всех, вы можете добавить логику для someCondition внутри WriteJson():

public class ConditionalNuGetPackageConverter : JsonConverter
{
    public override bool CanConvert(Type objectType) { return objectType == typeof(NuGetPackage); }

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

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        var package = (NuGetPackage)value;

        // Replace with your logic:
        var someCondition = !string.IsNullOrWhiteSpace(package.Description);

        if (someCondition)
            serializer.Serialize(writer, new { package.PackageId, package.Version, package.Description });
        else
            serializer.Serialize(writer, new { package.PackageId, package.Version });
    }
}

И затем сериализовать следующим образом:

var settings =  new JsonSerializerSettings
{
    Converters = { new ConditionalNuGetPackageConverter(), new VersionConverter() },
};
var json = JsonConvert.SerializeObject(p1, Formatting.Indented, settings);  

Рабочая .Net скрипка здесь .

...