JsonIgnore не работает для MemberSerialization. Поля в сериализации - PullRequest
0 голосов
/ 25 апреля 2019

Я пытаюсь сериализовать объект с помощью Newtonsoft.Json, используя поля из перечисления MemberSerialization.

Это класс, в который добавляется [JsonObject (MemberSerialization.Fields)]:

 [JsonObject(MemberSerialization.Fields)] 
        public class Employee {
            [JsonIgnore]
            public int ID { get; set; }
            [JsonProperty]
            public string Name { get; set; } 
            public char Gender { get; set; }
            [JsonProperty]
            public string WorkPhone { get; set; }
            private string Address { get; set; }
            [JsonProperty]
            public List<string> Skills { get; set; }         
        }

// Основная часть:

Employee e1 = new Employee() {
                ID = 1,
                Name = "Igor",
                Gender = 'M',
                WorkPhone = "78123456",
                Skills = new List<string>() { "C#", "SQL Server" }
            };

    string json = JsonConvert.SerializeObject(employees, Formatting.Indented);
                string path = @"..\JsonSerialization.json";
                File.WriteAllText(path, json);

Сериализация дает вывод, который не ожидается:

[
  {
    "<ID>k__BackingField": 1,
    "<Name>k__BackingField": "Igor",
    "<Gender>k__BackingField": "M",
    "<WorkPhone>k__BackingField": "78123456",
    "<Address>k__BackingField": "ul. Partizanski odredi, Skopje",
    "<Skills>k__BackingField": [
      "C#",
      "SQL Server"
    ]
  } 
]

Если я прокомментирую атрибут класса

//[JsonObject(MemberSerialization.Fields)] 

тогда функционал работает. Есть мысли по этому поводу, почему это так? Я не могу найти его в документации Newtonsoft.Json.

Однако атрибут JsonIgnore отлично работает с

[JsonObject(MemberSerialization.OptOut)] 
and
[JsonObject(MemberSerialization.OptIn)] 

Ответы [ 2 ]

2 голосов
/ 25 апреля 2019

Когда вы используете авто-свойство (то есть { get; set; }), "компилятор создает приватное анонимное поле поддержки, к которому можно получить доступ только через методы доступа get и set свойства" ( документы)

То, что вы видите здесь, это те частные поля поддержки, как документы для MemberSerialization.Fields скажем - " Все открытые и закрытые поля сериализуются. "

Поскольку все ваши свойства являются общедоступными, и у вас нет полей в классе, зачем вам устанавливать это значение в любом случае?

0 голосов
/ 25 апреля 2019

Даже если у меня есть поля и авто-свойства, я ожидаю, что только поля будут сериализованы.Тем не менее, авто-свойства тоже есть.Он был просто опробован, и мы не ожидали каких-либо данных о свойствах в сериализованном файле.Теперь понятно, почему k__BackingField существует.Спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...