我需要转换JSON中的类,但我只需要基属性.

例如,在下面的类A中,我只需要前3个属性,但不能修改类(从数据库自动生成). 我已经创建了一个定制的JsonConverter,并用我的逻辑填充了方法CanConvert,但这不起作用,并将对象A的列表转换为OutOfMemory异常

class A {
   string name {get; set;}
   string surname {get; set;}
   string roleCode {get; set;}
   Role role {get; set;}
}

-----

public override bool CanConvert(Type objectType)
{
    var isDate = objectType == typeof(DateTime) || objectType == typeof(DateTime?) || objectType == typeof(Nullable<DateTime>);
    var isString = objectType == typeof(string);
    var isClass = objectType.IsClass;
    return !isClass && !(isDate || isString);
}

推荐答案

您可以使用自定义的合同解析器: See Json.NET Documentation
对于您的情况,它可能如下所示:

public class ShouldSerializeContractResolver : DefaultContractResolver
{
    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        JsonProperty property = base.CreateProperty(member, memberSerialization);

        if (property.DeclaringType == typeof(A) && property.PropertyName == "role")
        {
            property.ShouldSerialize = instance => false;
        }

        return property;
    }
}

并使用它(loTestObject是类型A的实例):

string json = JsonConvert.SerializeObject(loTestObject,
    Formatting.Indented,
    new JsonSerializerSettings { ContractResolver = new ShouldSerializeContractResolver() }
);

Csharp相关问答推荐

如何禁用ASP.NET MVP按钮,以便无法使用开发人员控制台重新启用它

EF Core 8—应用客户端投影后无法转换集操作

为什么在ANTLR4中会出现不匹配的输入错误?""

使用命令初始化可绑定属性

如何在C#中将对象[*,*]直接转换为字符串[*,*]?

如何模拟耐久任务客户端在统一测试和获取错误在调度NewsListationInstanceAsync模拟设置

可为空的泛型属性

如何定义EFCore中的多个穿透

Nuget包Serilog.Sinks.AwsCloudwatch引发TypeLoadExceptions,因为父类型是密封的

将轮询与超时同步

获取具有AutoFaces的所有IOptions对象的集合

如何将字符串变量传递给JObject C#-无法加载文件或程序集';System.Text.Json

在两个已具有一对多关系的表之间添加另一个一对多关系

是否由DI容器自动处理由ActivatorUilties.CreateInstance()创建的服务?

如何返回具有泛型的类?

用MongoDB c#驱动程序删除和返回嵌套数组中的文档

c#在后台实现类型化数组

如何使用.NET 8.0中新的CompositeFormat类?

在.Net 8 Visual Studio 2022中启用本机AOT发布时发布失败

客户端/服务器RPC如何处理全局变量?