Json 序列化在不分配值时忽略属性,但在分配 null 时应存在属性



>我有一个定义为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. 案例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"
}
  1. 案例 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
}

我用不同的情况对其进行了测试,它工作正常。

最新更新