Ошибки создания сообщений Django Неизвестная кодировка «utf8»

На самом деле существует несколько довольно простых подходов, которые вы можете использовать для достижения желаемого результата.

Предположим, например, что у вас в настоящее время определены ваши классы следующим образом:

class Config
{
    public Fizz ObsoleteSetting { get; set; }
    public Bang ReplacementSetting { get; set; }
}

enum Fizz { Alpha, Beta, Gamma }

class Bang
{
    public string Value { get; set; }
}

И вы хотите это сделать:

string json = @"{ ""ObsoleteSetting"" : ""Gamma"" }";

// deserialize
Config config = JsonConvert.DeserializeObject(json);

// migrate
config.ReplacementSetting = 
    new Bang { Value = config.ObsoleteSetting.ToString() };

// serialize
json = JsonConvert.SerializeObject(config);
Console.WriteLine(json);

Чтобы получить это:

{"ReplacementSetting":{"Value":"Gamma"}}

Подход 1: Добавить метод Shouldererize

Json. NET имеет возможность условно сериализовать свойства, ища соответствующие методы ShouldSerialize в классе.

Чтобы использовать эту функцию, добавьте в ваш класс метод boolean ShouldSerializeBlah(), где Blah заменяется именем свойства, которое вы не хотите сериализовать. Сделать реализацию этого метода всегда возвращать false.

class Config
{
    public Fizz ObsoleteSetting { get; set; }

    public Bang ReplacementSetting { get; set; }

    public bool ShouldSerializeObsoleteSetting()
    {
        return false;
    }
}

Примечание: если вам нравится этот подход, но вы не хотите испортить публичный интерфейс своего класса, введя ShouldSerialize метод, вы можете использовать IContractResolver, чтобы сделать то же самое программно. См. Сериализация условных свойств в документации.

Подход 2: Управление JSON с помощью JObjects

Вместо использования JsonConvert.SerializeObject для выполнения сериализации загрузите config в JObject, а затем просто удалите нежелательное свойство из JSON перед его записью. Это всего лишь пара дополнительных строк кода.

JObject jo = JObject.FromObject(config);

// remove the "ObsoleteSetting" JProperty from its parent
jo["ObsoleteSetting"].Parent.Remove();

json = jo.ToString();

Подход 3: Умный (ab) использование атрибутов

  1. Применить атрибут [JsonIgnore] к свойству, которое вы не хотите сериализоваться.
  2. Добавьте альтернативный, private установщик свойств в класс с тем же типом, что и исходное свойство. Сделайте реализацию этого свойства, задайте исходное свойство.
  3. Примените атрибут [JsonProperty] к альтернативному сеттеру, присвоив ему то же имя JSON, что и исходное свойство.

Вот пересмотренный класс Config:

class Config
{
    [JsonIgnore]
    public Fizz ObsoleteSetting { get; set; }

    [JsonProperty("ObsoleteSetting")]
    private Fizz ObsoleteSettingAlternateSetter
    {
        // get is intentionally omitted here
        set { ObsoleteSetting = value; }
    }

    public Bang ReplacementSetting { get; set; }
}

13
задан Steve K 15 February 2015 в 23:47
поделиться