Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.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
C#json使用默认转换器而不是自定义转换器进行转换_C#_Json.net - Fatal编程技术网

C#json使用默认转换器而不是自定义转换器进行转换

C#json使用默认转换器而不是自定义转换器进行转换,c#,json.net,C#,Json.net,我有一个类,它有一个自定义的JsonConverter: [JsonConverter(typeof(TheShapeSerializer))] public class TheShape : IShape { //.... } 我不能换班。自定义序列化程序的工作方式不适合我的需要 是否有方法使用默认序列化程序而不是形状序列化程序序列化形状的实例 同样,是否有一种方法可以在序列化时根据给定条件选择多个转换器?选择JSONConverter的顺序如下: public class ShapeCon

我有一个类,它有一个自定义的
JsonConverter

[JsonConverter(typeof(TheShapeSerializer))]
public class TheShape : IShape {
//....
}
我不能换班。自定义序列化程序的工作方式不适合我的需要

是否有方法使用默认序列化程序而不是形状序列化程序序列化形状的实例


同样,是否有一种方法可以在序列化时根据给定条件选择多个转换器?

选择JSONConverter的顺序如下:

public class ShapeContainer
{
    [JsonConverter(typeof(NoConverter))]
    public TheShape Shape { get; set; }

    [JsonProperty(ItemConverterType = typeof(NoConverter))]
    public List<TheShape> Shapes { get; set; }
}
var settings = new JsonSerializerSettings
{
    ContractResolver = shapeResolver,
};
var json = JsonConvert.SerializeObject(root, settings);
使用JsonConverter的优先级是成员属性,然后是类属性,最后是传递给JsonSerializer的任何转换器


因此,您不能通过使用禁用应用的
JsonConverter
。相反,您有以下选项

首先,如果您控制的某个类型直接引用了您的
形状
,则您可以从到抓取
NoConverter
,并使用
JsonConverterAttribute
将其应用于引用成员,例如:

public class ShapeContainer
{
    [JsonConverter(typeof(NoConverter))]
    public TheShape Shape { get; set; }

    [JsonProperty(ItemConverterType = typeof(NoConverter))]
    public List<TheShape> Shapes { get; set; }
}
var settings = new JsonSerializerSettings
{
    ContractResolver = shapeResolver,
};
var json = JsonConvert.SerializeObject(root, settings);
然后,出于性能原因,按如下所述在某处定义静态成员:

并序列化如下:

public class ShapeContainer
{
    [JsonConverter(typeof(NoConverter))]
    public TheShape Shape { get; set; }

    [JsonProperty(ItemConverterType = typeof(NoConverter))]
    public List<TheShape> Shapes { get; set; }
}
var settings = new JsonSerializerSettings
{
    ContractResolver = shapeResolver,
};
var json = JsonConvert.SerializeObject(root, settings);
演示小提琴显示两个选项

同样,有没有一种方法可以让多个转换器在序列化时根据给定条件进行选择


显然,您可以根据某些运行时条件向
JsonSerializerSettings.converters
添加不同的转换器。但是,如果您想用运行时转换器取代静态应用的转换器,则需要适当地设置类型,例如,使用
overridablejsonconverterdercorator
from to.

直接调用serialize/deserialize
var json=JsonConvert.SerializeObject时,可以尝试使用另一个转换器(obj,新的MyCustomConverter())
这样您就可以更好地控制流程。这是一个有趣的问题。我正在检查我建议的评论是否可行,并且没有看到任何人有类似的问题。
JsonConverter
使用属性应用取代了通过设置应用的
JsonConverter
。从:哪个JsonConverter的优先级使用的是成员属性,然后是类属性,最后是传递给JsonSerializer的任何转换器。您需要使用一个@dbc,这在文档中是一个很好的发现。我不知道。这很好。我使用了ContactResolver方法,因为第一个解决方案与您所说的原因不相关,并且它工作得很好