Как игнорировать JSON сериализацию константных свойств с помощью System.Text. Json? - PullRequest
3 голосов
/ 04 марта 2020

Я пытаюсь перейти с Newtonsoft. Json на System.Text. Json. «[Newtonsoft. Json .JsonIgnore]» работает для игнорирования свойства константы во время сериализации, а «[System.Text. Json .Serialization.JsonIgnore]» - нет. Интересно, есть ли обходной путь.

Поэтому я пытаюсь перейти с;

using Newtonsoft.Json;

public class MyClass: MyBaseClass
{
    [JsonIgnore]
    public const string MyConstString = "lets get rid of netwonsoft dependency";

    public string data;

    public String(string data)
    {
        this.data = data;
    }
}

на;

using System.Text.Json.Serialization;

public class MyClass: MyBaseClass
{
    [JsonIgnore] // Error
    public const string MyConstString = "lets get rid of netwonsoft dependency";

    public string data;

    public String(string data)
    {
        this.data = data;
    }
}

Описание ошибки:; "Атрибут 'JsonIgnore' недопустим для этого типа объявления. Он действителен только для объявлений 'property, indexer'."

Это потому, что System.Text. Json не делает Поддержите такое использование JsonIgnore, или я что-то упустил? Я не смог найти ничего полезного по этой ссылке относительно этой проблемы. У вас есть идеи?

1 Ответ

2 голосов
/ 04 марта 2020

Атрибут JSON. Net [JsonIgnore] имеет использование , установленное на AttributeTargets.Property | AttributeTargets.Field, что означает, что он может использоваться на const. Однако новая версия * 10035 * Core API для [JsonIgnore] установлена ​​только на AttributeTargets.Property. Это означает, что вы можете использовать его только для свойства .

Сказав, что JSON. Net не будет сериализовать значения const, если вы явно не скажете его сериализации с помощью атрибут [JsonProperty], который затем добавляет другой атрибут, чтобы в любом случае игнорировать его.

Например, JSON. Net будет сериализовать класс, который есть в вашем вопрос как:

{"data":"foo"}

В то время как сериализатор в System.Text.Json даст вам это:

{}

Так что еще одна проблема заключается в том, что более новый API не сериализует поля . Вывод из этого заключается в том, что вы должны использовать современные C# методы, а это означает использование свойств, например:

public string data { get; set; }
...