我有一个定义为Car的Class,我想序列化为JSON,因为当你不分配任何属性时,忽略属性,但如果我分配为null,属性应该出现在JSON中。
举个例子。
public class Car
{
public int CarId { get; set; }
public string Brand { get; set; }
public string Model { get; set; }
public string Color { get; set; }
}
如果我将数值分配如下
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"
}
如果我把数值赋值为下面(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
});
为了更通用,你必须创建你自己的ContractResolver类。
第一步。 车的等级应如下。
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
}
第二步: 你将需要创建以下类。
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;
}
}
第三步: 创建汽车对象。
var car = new Car {
CarId = 1,
Brand = "Hundai",
Model = null
};
第四步: 序列化对象 请注意我们如何在这里创建ContractResolver :
var SerializedCar = JsonConvert.SerializeObject(car,
Formatting.Indented,
new JsonSerializerSettings {ContractResolver = new houldSerializeContractResolver()
});
第五步。 打印输出。
Console.WriteLine(SerializedCar);
最后。 结果:
{
"CarId": 1,
"Brand": "Hundai",
"Model": null
}
步骤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");
}
}
第二步: 现在当你创建Car对象时,如下图所示。
var car = new Car {
CarId = 1,
Brand = "Hundai",
Model = null
};
第三步: 序列化对象如下
var SerializedCar = JsonConvert.SerializeObject(car, Formatting.Indented);
第四步: 把输出写到控制台
Console.WriteLine(SerializedCar);
终于。 结果和你预期的一样
{
"CarId": 1,
"Brand": "Hundai",
"Model": null
}
我在不同的情况下测试了它,它工作正常。