当不赋值时,Json序列化忽略属性,但当赋值为null时,属性应该存在。

问题描述 投票:0回答:1

我有一个定义为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; }
    }
  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"
}

我使用了Newtonsoft Json库,如下图所示,但无法得到预期的输出。

string jsonIgnoreNullValues = JsonConvert.SerializeObject(car, Formatting.Indented, new JsonSerializerSettings
            {
                NullValueHandling = NullValueHandling.Ignore
            });
c# json serialization json.net
1个回答
0
投票

为了更通用,你必须创建你自己的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
   }

0
投票

步骤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
}

我在不同的情况下测试了它,它工作正常。

© www.soinside.com 2019 - 2024. All rights reserved.