c#等效于序列化json

时间:2016-01-06 20:57:49

标签: javascript c# json

对于为此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?

谢谢!

2 个答案:

答案 0 :(得分:2)

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

open -a Terminal.app /path/to/script.sh

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

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

答案 1 :(得分:0)

您可以使用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,则将跳过该属性。

取自this link

要实际序列化,当然要使用:

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

根据上述条件,secondObj(偶数索引)不会有Value1