Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Serialization Newtonsoft Json.NET在运行时忽略Json转换器中的成员或调用JsonConverter序列化对象_Serialization_Json.net_Deserialization_Ignore - Fatal编程技术网

Serialization Newtonsoft Json.NET在运行时忽略Json转换器中的成员或调用JsonConverter序列化对象

Serialization Newtonsoft Json.NET在运行时忽略Json转换器中的成员或调用JsonConverter序列化对象,serialization,json.net,deserialization,ignore,Serialization,Json.net,Deserialization,Ignore,假设我有以下用于序列化和/或反序列化的自定义JsonConverter: public class VersionConverter : JsonConverter<Version> { public override void WriteJson(JsonWriter writer, Version value, JsonSerializer serializer) { writer.WriteValue(value.ToString());

假设我有以下用于序列化和/或反序列化的自定义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; }
}
我希望Json.NET转换器忽略NuGetPackage类的Description成员变量

注意:我不想使用以下“marker boolean”成员变量:

public bool ShouldSerializeINSERT_YOUR_PROPERTY_NAME_HERE()
{
    if(someCondition){
        return true;
    }else{
        return false;
    }
}
我宁愿指定忽略某个特定的成员变量

a) 当我的代码调用JsonConvert.Serialized对象时

b) 或者在VersionConverter代码类本身中


有人能告诉我如何以这种方式忽略特定的成员变量吗?

由于
NuGetPackage
相当简单,您可以为
NuGetPackage
编写一个额外的
JsonConverter
,它只序列化您需要的成员,例如:

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);      
var settings =  new JsonSerializerSettings
{
    Converters = { new ConditionalNuGetPackageConverter(), new VersionConverter() },
};
var json = JsonConvert.SerializeObject(p1, Formatting.Indented, settings);  
如果要同时序列化多个
NuGetPackage
实例,并且需要为部分(而非全部)编写
Description
,则可以在
WriteJson()内部添加
someCondition
的逻辑:

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 VersionConverter() },
};
if (!someCondition)
    settings.Converters.Add(new SimplifiedNuGetPackageConverter());
var json = JsonConvert.SerializeObject(p1, Formatting.Indented, settings);      
var settings =  new JsonSerializerSettings
{
    Converters = { new ConditionalNuGetPackageConverter(), new VersionConverter() },
};
var json = JsonConvert.SerializeObject(p1, Formatting.Indented, settings);  

正在使用.Net FIDLE。

您不能使
numgetpackage.Description
从转换器中跳过
numgetpackage.Version
。但是,如果
NuGetPackage
像您展示的那样简单,您可以为它编写第二个转换器。(我假设您不能修改
NuGetPackage
)您能否详细说明为NuGetPackage编写第二个转换器?请尽可能显示示例代码:)ThxNote-我没有使用
JsonConverter
,只是因为它不支持Json.NET版本11。