在Json.NET中使用JsonSerializerSettings在属性中指定时如何禁用TypeNameHandling?

安库什

有时"$type",即使由指定,我也需要抑制Json.NET属性输出JsonPropertyAttribute.ItemTypeNameHandling如何才能做到这一点?

我的根类如下所示:

public class DomainResource
{
    [JsonProperty(ItemTypeNameHandling = TypeNameHandling.Auto)]
    public List<Extension> Extensions { get; set; }
}

此外,我还有一个如下的类层次结构Extension

public class Extension
{
    readonly string url;

    public string Url { get { return url; } }

    public Extension(string url)
    {
        this.url = url;
    }
}

public class IntegerExtension : Extension
{
    public IntegerExtension(string url) : base(url) { }

    [JsonProperty("ValueInteger")]
    public int Value { get; set; }
}

我想ItemTypeNameHandling在序列化过程中的某些情况下忽略,但是我找不到解决方法。当我不想要"$type"使用以下代码的属性时,我尝试使用TypeNameHandling.None将JsonSerializerSettings设置为jsonconvert的输入

public static string SerializeObject(object value)
{
    JsonSerializerSettings jsonSettings = new JsonSerializerSettings
    {
        ContractResolver = new CamelCasePropertyNamesContractResolver(),
        NullValueHandling = NullValueHandling.Ignore,
        TypeNameHandling = TypeNameHandling.None,

    };
    jsonSettings.Converters.Add(new StringEnumConverter
    {
        CamelCaseText = true
    });
    return JsonConvert.SerializeObject(value, Formatting.None, jsonSettings);
}

然后按如下方式使用它:

var res = new DomainResource();
res.Extensions = new List<Extension>();
res.Extensions.Add(new IntegerExtension("ewwer"){Value = 3});

var x = CustomJsonConvert.SerializeObject(res);

我想要的JSON是:

{“扩展名”:[{“ valueInteger”:3,“ url”:“ ewwer”}]}

但是,它包含"$type"如下所示的属性:

{“ extensions”:[{“ $ type”:“ DicomtoJsonConverter.IntegerExtension,DicomtoJsonConverter”,“ valueInteger”:3,“ url”:“ ewwer”}]}}

如何在不更改类的情况下抑制"$type"属性的输出DomainResource

数据库

即使由指定您也可以使用自定义ContractResolver禁止显示类型信息首先,定义以下合同解析器:JsonPropertyAttribute.TypeNameHandlingJsonPropertyAttribute.ItemTypeNameHandlingJsonContainerAttribute.ItemTypeNameHandling

public class NoTypeNameHandlingContractResolver : DefaultContractResolver
{
    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
    {
        var property = base.CreateProperty(member, memberSerialization);
        // Suppress JsonPropertyAttribute.TypeNameHandling
        property.TypeNameHandling = null;
        // Suppress JsonPropertyAttribute.ItemTypeNameHandling
        property.ItemTypeNameHandling = null;
        return property;
    }

    protected override JsonContract CreateContract(Type objectType)
    {
        var contract = base.CreateContract(objectType);
        if (contract is JsonContainerContract)
        {
            // Suppress JsonContainerAttribute.ItemTypeNameHandling
            ((JsonContainerContract)contract).ItemTypeNameHandling = null;
        }
        return contract;
    }
}

然后,修改CustomJsonConvert.SerializeObject()如下:

public static class CustomJsonConvert
{
    // You may want to cache the contract resolver for best performance, see
    // https://stackoverflow.com/questions/33557737/does-json-net-cache-types-serialization-information
    static readonly JsonSerializerSettings jsonSettings;
    static CustomJsonConvert()
    {
        jsonSettings = new JsonSerializerSettings
        {
            ContractResolver = new NoTypeNameHandlingContractResolver
            {
                NamingStrategy = new CamelCaseNamingStrategy
                {
                    // These are the settings used by CamelCasePropertyNamesContractResolver by default.
                    // Change them if this is not what you want.
                    OverrideSpecifiedNames = true,
                    ProcessDictionaryKeys = true,
                },
            },
            NullValueHandling = NullValueHandling.Ignore,
            TypeNameHandling = TypeNameHandling.None,
            Converters = { new StringEnumConverter { CamelCaseText = true } },
        };
    }

    public static string SerializeObject(object value)
    {
        return JsonConvert.SerializeObject(value, Formatting.None, jsonSettings);
    }
}

如果您使用的Json.NET版本早于9.0.1,则由于该版本中引入了Json.NET,因此您需要继承CamelCasePropertyNamesContractResolver而不是继承DefaultContractResolverNamingStrategy

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Json.net中使用自定义JsonConverter和TypeNameHandling

来自分类Dev

根据JsonSerializerSettings确定JSON.Net属性映射

来自分类Dev

即使使用 JsonSerializerSettings,Json.net 循环引用异常

来自分类Dev

Json.Net-如何在歧义JSON中指定反序列化类型

来自分类Dev

如何在JSON密钥中指定值

来自分类Dev

在JSON中指定通配符?

来自分类Dev

使用TypeNameHandling = auto的IEnumerable的Json.Net序列化

来自分类Dev

如何在 json 模式中指定某个属性是必需的并且还必须包含特定值?

来自分类Dev

使用Serilog时如何覆盖appsettings.json中指定的应用程序名称?

来自分类Dev

使用 MockitoJUnitRunner 运行单元测试时如何在 JSON 响应中指定日期格式

来自分类Dev

在响应中指定 JSON 名称

来自分类Dev

如何在 Swagger-PHP 中指定默认的 JSON 正文?

来自分类Dev

如何从PHP的JSON输出中指定字段值的返回类型?

来自分类Dev

如何在manifest.json中指定图标?

来自分类Dev

如何在json文本中指定关键字?

来自分类Dev

如何在 jmespath 和 jmeter 中指定嵌套的 json 路径

来自分类Dev

脚本如何计算包含 json 数据中指定频率的对象

来自分类Dev

如何在Postman Collection中指定JSON请求正文示例

来自分类Dev

如何在build.json中指定Cordova构建目标

来自分类Dev

如何在Express中指定json2csv的配置

来自分类Dev

如何在切换SwiftUI中使用json属性?

来自分类Dev

如何在锚标签数据属性中使用Json Value?

来自分类Dev

如何在表格中使用JSON属性名称?

来自分类Dev

是否可以在属性中指定路径,以将类中的属性映射到JSON中的子属性?

来自分类Dev

如何在.csproj文件(而不是project.json)中指定ASP.NET Core目标框架导入?

来自分类Dev

Json.NET - 使用 TypeNameHandling 时处理未知的派生类型

来自分类Dev

是否可以使用受信任类型的标记来防止 Json.Net TypeNameHandling 漏洞?

来自分类Dev

在JSON.NET中使用List <T>属性进行序列化期间,如何将空JSON属性默认为空数组?

来自分类Dev

使用NuGet安装json.net后,如何在我的课程中使用json.net?

Related 相关文章

  1. 1

    在Json.net中使用自定义JsonConverter和TypeNameHandling

  2. 2

    根据JsonSerializerSettings确定JSON.Net属性映射

  3. 3

    即使使用 JsonSerializerSettings,Json.net 循环引用异常

  4. 4

    Json.Net-如何在歧义JSON中指定反序列化类型

  5. 5

    如何在JSON密钥中指定值

  6. 6

    在JSON中指定通配符?

  7. 7

    使用TypeNameHandling = auto的IEnumerable的Json.Net序列化

  8. 8

    如何在 json 模式中指定某个属性是必需的并且还必须包含特定值?

  9. 9

    使用Serilog时如何覆盖appsettings.json中指定的应用程序名称?

  10. 10

    使用 MockitoJUnitRunner 运行单元测试时如何在 JSON 响应中指定日期格式

  11. 11

    在响应中指定 JSON 名称

  12. 12

    如何在 Swagger-PHP 中指定默认的 JSON 正文?

  13. 13

    如何从PHP的JSON输出中指定字段值的返回类型?

  14. 14

    如何在manifest.json中指定图标?

  15. 15

    如何在json文本中指定关键字?

  16. 16

    如何在 jmespath 和 jmeter 中指定嵌套的 json 路径

  17. 17

    脚本如何计算包含 json 数据中指定频率的对象

  18. 18

    如何在Postman Collection中指定JSON请求正文示例

  19. 19

    如何在build.json中指定Cordova构建目标

  20. 20

    如何在Express中指定json2csv的配置

  21. 21

    如何在切换SwiftUI中使用json属性?

  22. 22

    如何在锚标签数据属性中使用Json Value?

  23. 23

    如何在表格中使用JSON属性名称?

  24. 24

    是否可以在属性中指定路径,以将类中的属性映射到JSON中的子属性?

  25. 25

    如何在.csproj文件(而不是project.json)中指定ASP.NET Core目标框架导入?

  26. 26

    Json.NET - 使用 TypeNameHandling 时处理未知的派生类型

  27. 27

    是否可以使用受信任类型的标记来防止 Json.Net TypeNameHandling 漏洞?

  28. 28

    在JSON.NET中使用List <T>属性进行序列化期间,如何将空JSON属性默认为空数组?

  29. 29

    使用NuGet安装json.net后,如何在我的课程中使用json.net?

热门标签

归档