c#等效于序列化json

c# equivalent for serializing json

本文关键字:序列化 json      更新时间:2023-09-26

为这个javascript代码创建json序列化数据的等价物是什么:

chartData.push({date: "bla",value1: "bla1",value2: "bla2"});
chartData.push({date: "blx",value2: "blax2"});

json看起来像这样:

[{
       "date": bla,
       "value1": bla1,
       "value2": bla3,
   }, {
       "date": blx,
       "value2": blax2
   }]

我尝试创建一个类列表,但当我不分配value1属性时,该值将为零。但是我根本不希望这个属性在json中显示,如果没有赋值的话。

 List <Models.HistoClass> HistoData= new List<Models.HistoClass>();
            HistoData.Add(new Models.HistoClass {date="bla",value1="bla1",value2="bla3"});
            HistoData.Add(new Models.HistoClass { date= "blx", value2="blax2" });

我应该如何创建数据模型来拥有这样的json?

谢谢!

如果你以显示的方式手动创建数据,你可以使用匿名类型来构建你想要的数据:

 List <object> HistoData= new List<object>();
 HistoData.Add(new {date="bla",value1="bla1",value2="bla3"});
 HistoData.Add(new { date= "blx", value2="blax2" });

但是,如果您想使用强类型,并且/或者您的代码每次都以相同的方式初始化值,但有时值不存在,那么您可以使值为null,并告诉JSON.NET在序列化时忽略null属性:

public class HistoClass
{
    public string date; 
    [JsonProperty(NullValueHandling=NullValueHandling.Ignore)]
    public int? value1;
    [JsonProperty(NullValueHandling=NullValueHandling.Ignore)]
    public int? value2;
}
...
List <Models.HistoClass> HistoData= new List<Models.HistoClass>();
HistoData.Add(new Models.HistoClass {date="bla",value1="bla1",value2="bla3"});
HistoData.Add(new Models.HistoClass { date= "blx", value2="blax2" });

您可以使用Json.NET的ShouldSerialize:

Public class DateAndValues
{
   public DateTime Date {get; set;}
   public Int32 Index {get; set;}
   public Int32 Value1 {get; set;}
   public Int16 Value2 {get; set;}
   public bool ShouldSerializeValue1 ()
   {
      // your condition for serialization, for example even objects:
      this.Index % 2 != 0;
   }
}

此描述:

若要有条件地序列化属性,请添加一个返回与该属性同名的布尔值的方法,然后在方法名称前加上ShouldSerialize。方法的结果确定属性是否序列化。如果该方法返回true,则该属性将被序列化,如果返回false,则将跳过该属性。

取自此链接。

当然,要真正序列化,请使用:

var firstObj = new DateAndValues { Index = 1, .. };
var secondObj = new DateAndValues { Index = 2, .. };
string json = 
  JsonConvert.SerializeObject(new[] {firstObj, secondObj}, Formatting.Indented);

并且根据上述条件secondObj(偶数索引)将不具有Value1