C# 序列化整个JSON对象,但在反序列化时跳过单个属性

C# 序列化整个JSON对象,但在反序列化时跳过单个属性,c#,json,serialization,C#,Json,Serialization,序列化对象时,我有一个List属性,其中T是我希望自然序列化的抽象类型。但是,在反序列化对象时,我希望/需要手动反序列化此抽象列表。我用一个定制的JsonConverter来完成后面的部分,它查看每个项目的属性 然后将其反序列化为正确的类型并将其放入列表中 但我还需要反序列化对象的其余部分,而不是逐个属性进行反序列化。下面是伪代码 MyObject class MyObject { public Guid Id; public string Name; public Li

序列化对象时,我有一个
List
属性,其中
T
是我希望自然序列化的抽象类型。但是,在反序列化对象时,我希望/需要手动反序列化此抽象列表。我用一个定制的
JsonConverter
来完成后面的部分,它查看每个项目的属性 然后将其反序列化为正确的类型并将其放入列表中

但我还需要反序列化对象的其余部分,而不是逐个属性进行反序列化。下面是伪代码

MyObject

class MyObject {
    public Guid Id;
    public string Name;
    public List<MyAbstractType> Things;
}
类MyObject{
公共Guid Id;
公共字符串名称;
公开物品清单;
}
MyObjectConverter

class MyObjectConverter : JsonConverter {
    public override object ReadJson(reader, ..., serializer) {
        // Line below will fail because the serializer will attempt to deserlalize the list property.
        var instance = serializer.Deserialize(reader);
        var rawJson = JObject.Load(reader); // Ignore reading from an already-read reader.

        // Now loop-over and deserialize each thing in the list/array.
        foreach (var item in rawJson.Value<JArray>(nameof(MyObject.Things))) {
            var type = item.Value<string>(nameof(MyAbstractType.Type));
            MyAbstractType thing;

            // Create the proper type.
            if (type == ThingTypes.A) {
                thing = item.ToObject(typeof(ConcreteTypeA));
            }   
            else if (type == ThingTypes.B) {
                thing = item.ToObject(typeof(ConcreteTypeB));
            }

            // Add the thing.
            instance.Things.Add(thing);
        }

        return instance;
    }
}
类MyObjectConverter:JsonConverter{
公共重写对象ReadJson(读取器,…,序列化器){
//下面的行将失败,因为序列化程序将尝试反序列化列表属性。
var实例=序列化程序。反序列化(读取器);
var rawJson=JObject.Load(reader);//忽略已读读取器的读取。
//现在循环并反序列化列表/数组中的每一项。
foreach(rawJson.Value(nameof(MyObject.Things))中的var项){
var type=item.Value(nameof(MyAbstractType.type));
我的抽象型事物;
//创建正确的类型。
if(type==ThingTypes.A){
thing=item.ToObject(typeof(ConcreteTypeA));
}   
else if(type==ThingTypes.B){
thing=item.ToObject(typeof(ConcreteTypeB));
}
//加上这个东西。
实例.事物.添加(事物);
}
返回实例;
}
}

总而言之,我想手动处理
事物的反序列化,但允许它们自然序列化。

是否应该通过实现和手动读取器来工作?如果我理解正确,问题是您没有在
CanConvert
返回正确的值,只有当传递给它的
类型
是反序列化程序将处理的类型时,才必须返回true,在这种情况下,
MyAbstractType
,如果这样做,则仅当从JSON读取
MyAbstractType
的实例时才会调用反序列化程序,对象的其余部分将像往常一样反序列化。为什么要将转换器应用于
MyObject
?您可以将转换器应用于
MyAbstractType
,然后按照或的说明操作。此外,您的问题有点让人困惑。您是否在询问如何反序列化或序列化?如果序列化,它是@dbc的副本。答案是“您可以将转换器应用于
MyAbstractType
”。如果你加上它作为答案,我会接受的。谢谢