>我有一个定义为Car的类,当您不向属性分配任何内容时,我想序列化为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; }
}
- 案例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"
}
我已经使用了牛顿软件 Json 库,如下所示,但无法获得预期的输出
string jsonIgnoreNullValues = JsonConvert.SerializeObject(car, Formatting.Indented, new JsonSerializerSettings
{
NullValueHandling = NullValueHandling.Ignore
});
为了更通用,你必须创建自己的合约解析器类
第一步:汽车类应如下:
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 步:序列化对象 -请注意我们如何在此处创建合约解析器:
var SerializedCar = JsonConvert.SerializeObject(car,
Formatting.Indented,
new JsonSerializerSettings {ContractResolver = new ShouldSerializeContractResolver()
});
第 5 步:打印输出:
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");
}
}
步骤2:现在,当您创建汽车对象时,如下所示:
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
}
我用不同的情况对其进行了测试,它工作正常。