Json Сериализация игнорирует свойства, когда не присваивает значение, но свойство должно присутствовать при назначении null - PullRequest
0 голосов
/ 16 июня 2020

У меня есть класс, определенный как Car, я хочу сериализовать его как JSON, поскольку игнорирую свойства, если вы ничего не назначаете свойству, но свойство должно присутствовать в JSON, если я присвоил значение null.

Пример:

 public class Car
    {
        public int CarId { get; set; }
        public string Brand { get; set; }
        public string Model { get; set; }
        public string Color { get; set; }
    }
  1. Случай 1

если я назначу значение, как показано ниже,

            Car car = new Car();
            car.CarId = 1;
            car.Color = "Black";
            car.Brand = "Hundai";
            car.Model = null;

Ожидается JSON. как

{
  "CarId": 1,
  "Brand": "Hundai",
  "Model": null,
  "Color": "Black"
}
Случай 2

, если я назначу значение, как показано ниже (car.Model не назначено )

            Car car = new Car();
            car.CarId = 1;
            car.Color = "Black";
            car.Brand = "Hundai";

Ожидаемый JSON будет

{
  "CarId": 1,
  "Brand": "Hundai",
  "Color": "Black"
}

Я использовал библиотеку Newtonsoft Json, как показано ниже, но не смог получить ожидаемый результат

string jsonIgnoreNullValues = JsonConvert.SerializeObject(car, Formatting.Indented, new JsonSerializerSettings
            {
                NullValueHandling = NullValueHandling.Ignore
            });

Ответы [ 2 ]

0 голосов
/ 16 июня 2020

Чтобы быть более универсальным c, вы должны создать свой собственный класс ContractResolver

Шаг 1: Класс автомобиля должен быть следующим:

public class Car {
    public int CarId { get; set; }
    public string Brand { get; set; } = "null"; // Default value
    public string Model { get; set; } = "null"; // Default value
    public string Color { get; set; } = "null"; // Default value
}

Шаг 2: Вам необходимо создать следующий класс:

public class ShouldSerializeContractResolver : DefaultContractResolver {
    protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) {
        JsonProperty property = base.CreateProperty(member, memberSerialization);
        if (!property.PropertyName.Equals("CarId")) {
            property.ShouldSerialize =
                instance => {
                    var car = (Car)instance;
                    var value = car.GetType().GetProperty(property.PropertyName).GetValue(car, null);
                    return value == null || !value.ToString().Equals("null");
                };
        }
        return property;
    }
}

Шаг 3: создать объект автомобиля:

var car = new Car {
    CarId = 1,
    Brand = "Hundai",
    Model = null
};

Шаг 4: Сериализовать объект - Обратите внимание, как мы здесь создаем ContractResolver :

var SerializedCar = JsonConvert.SerializeObject(car, 
   Formatting.Indented, 
   new JsonSerializerSettings {ContractResolver = new ShouldSerializeContractResolver()
});

Шаг 5: Распечатайте вывод:

Console.WriteLine(SerializedCar);

Наконец: Результат:

   {
       "CarId": 1,
       "Brand": "Hundai",
       "Model": null
   }
0 голосов
/ 16 июня 2020

Шаг 1: Измените класс Car следующим образом:

public class Car {
    public int CarId { get; set; }
    public string Brand { get; set; } = "null"; // Default value
    public string Model { get; set; } = "null"; // Default value
    public string Color { get; set; } = "null"; // Default value

    // Serialize only when the default value changed
    public bool ShouldSerializeBrand() {
        return string.IsNullOrWhiteSpace(Brand) || !Brand.Equals("null");
    }

    public bool ShouldSerializeModel() {
        return string.IsNullOrWhiteSpace(Model) || !Model.Equals("null");
    }

    public bool ShouldSerializeColor() {
        return string.IsNullOrWhiteSpace(Color) || !Color.Equals("null");
    }

}

Шаг 2: Теперь, когда вы создаете объект car следующим образом:

 var car = new Car {
     CarId = 1,
     Brand = "Hundai",
     Model = null
 };

Шаг 3: Сериализуйте объект следующим образом:

var SerializedCar = JsonConvert.SerializeObject(car, Formatting.Indented);

Шаг 4: записать вывод в консоль

Console.WriteLine(SerializedCar);

Наконец: Результат именно такой, как вы ожидали:

{
  "CarId": 1,
  "Brand": "Hundai",
  "Model": null
}

Я тестировал его в разных случаях, он работает нормально.

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