使用自定义列表将 C# 模型序列化为 JSON
Serializing C# model with a custom list to JSON
我有一个包含列表的模型,我需要将其序列化为 JSON 以便向 Web 服务发送请求。
问题是在我的模型中有一个列表需要以特定格式序列化。
我的 class 如下所示:
[DataContract()]
public class StanjeZalihaLek : BaseParameters
{
[DataMember(Name = "datumStanje")]
public string _datumStanja;
[DataMember(Name = "type")]
public int Type { get; set; }
[IgnoreDataMember]
public DateTime? DatumStanja { get; set; }
[IgnoreDataMember()]
public List<Lek> ListaLek { get; set; }
[OnSerializing()]
protected void OnSerializingMethod(StreamingContext context)
{
_datumStanja = DatumStanja?.ToString(FormatDate);
}
}
所以除了List ListaLek { get;放; } 成员如下所示:
[DataContract()]
public class Lek
{
const string FormatDate = "dd.MM.yyyy";
[DataMember(Name = "datumUlaz")]
string _datumUlaza;
[DataMember(Name = "datumRok")]
string _rokUpotrebe;
[DataMember(Name = "jkl")]
public string JedinstvenaKlasifikacijaLeka { get; set; }
[DataMember(Name = "kolicina)")]
public double Kolicina { get; set; }
[DataMember(Name = "kpp")]
public string Kpp { get; set; }
[IgnoreDataMember]
public DateTime? DatumUlaza { get; set; }
[IgnoreDataMember]
public DateTime? RokUpotrebe { get; set; }
[OnSerializing()]
protected void OnSerializingMethod(StreamingContext context)
{
_datumUlaza = DatumUlaza?.ToString(FormatDate);
_rokUpotrebe = RokUpotrebe?.ToString(FormatDate);
}
}
我的序列化代码应该是这样的:
{
"idZu": "12345678",
"user": "ustanova1",
"pass": "pass1w0rd",
"type": "1",
"datumStanje": "26.02.2019",
"0": {
"jkl": "0010200",
"kolicina": "4",
"kpp": "071",
"datumUlaz": "26.02.2019",
"datumRok": " 31.12.2019"
},
"1": {
"jkl": "0010220",
"kolicina": "8",
"kpp": "071",
"datumUlaz": "26.02.2019",
"datumRok": " 31.12.2019"
},
"2": {
"jkl": "12205014",
"kolicina": "12",
"kpp": "071",
"datumUlaz": "26.02.2019",
"datumRok ": "31.12.2019"
}
}
因此列表中的每个新元素都有一个数字作为其 DataMember 名称,其中 idZu、user 和 pass 是来自 StanjeZalihaLek 派生的 BaseParameters class 的参数。
有什么想法吗?谢谢
问题已解决:
public static byte[] Serialize(this StanjeZalihaLek data)
{
var sb = new StringBuilder();
using (var tw = new System.IO.StringWriter(sb))
{
Newtonsoft.Json.JsonTextWriter jsonWriter = new JsonTextWriter(tw);
jsonWriter.WriteStartObject();
jsonWriter.WriteRaw(JsonConvert
.SerializeObject(data)
.Substring(1)
.TrimEnd('}'));
jsonWriter.WriteRaw(",");
int inx = 0;
foreach (var item in data.ListaLek)
{
var str = $"{inx++}";
jsonWriter.WritePropertyName(str);
jsonWriter.WriteRawValue(JsonConvert.SerializeObject(item));
}
jsonWriter.WriteEndObject();
jsonWriter.Close();
}
return System.Text.Encoding.UTF8.GetBytes(sb.ToString());
}
我有一个包含列表的模型,我需要将其序列化为 JSON 以便向 Web 服务发送请求。
问题是在我的模型中有一个列表需要以特定格式序列化。
我的 class 如下所示:
[DataContract()]
public class StanjeZalihaLek : BaseParameters
{
[DataMember(Name = "datumStanje")]
public string _datumStanja;
[DataMember(Name = "type")]
public int Type { get; set; }
[IgnoreDataMember]
public DateTime? DatumStanja { get; set; }
[IgnoreDataMember()]
public List<Lek> ListaLek { get; set; }
[OnSerializing()]
protected void OnSerializingMethod(StreamingContext context)
{
_datumStanja = DatumStanja?.ToString(FormatDate);
}
}
所以除了List ListaLek { get;放; } 成员如下所示:
[DataContract()]
public class Lek
{
const string FormatDate = "dd.MM.yyyy";
[DataMember(Name = "datumUlaz")]
string _datumUlaza;
[DataMember(Name = "datumRok")]
string _rokUpotrebe;
[DataMember(Name = "jkl")]
public string JedinstvenaKlasifikacijaLeka { get; set; }
[DataMember(Name = "kolicina)")]
public double Kolicina { get; set; }
[DataMember(Name = "kpp")]
public string Kpp { get; set; }
[IgnoreDataMember]
public DateTime? DatumUlaza { get; set; }
[IgnoreDataMember]
public DateTime? RokUpotrebe { get; set; }
[OnSerializing()]
protected void OnSerializingMethod(StreamingContext context)
{
_datumUlaza = DatumUlaza?.ToString(FormatDate);
_rokUpotrebe = RokUpotrebe?.ToString(FormatDate);
}
}
我的序列化代码应该是这样的:
{
"idZu": "12345678",
"user": "ustanova1",
"pass": "pass1w0rd",
"type": "1",
"datumStanje": "26.02.2019",
"0": {
"jkl": "0010200",
"kolicina": "4",
"kpp": "071",
"datumUlaz": "26.02.2019",
"datumRok": " 31.12.2019"
},
"1": {
"jkl": "0010220",
"kolicina": "8",
"kpp": "071",
"datumUlaz": "26.02.2019",
"datumRok": " 31.12.2019"
},
"2": {
"jkl": "12205014",
"kolicina": "12",
"kpp": "071",
"datumUlaz": "26.02.2019",
"datumRok ": "31.12.2019"
}
}
因此列表中的每个新元素都有一个数字作为其 DataMember 名称,其中 idZu、user 和 pass 是来自 StanjeZalihaLek 派生的 BaseParameters class 的参数。
有什么想法吗?谢谢
问题已解决:
public static byte[] Serialize(this StanjeZalihaLek data)
{
var sb = new StringBuilder();
using (var tw = new System.IO.StringWriter(sb))
{
Newtonsoft.Json.JsonTextWriter jsonWriter = new JsonTextWriter(tw);
jsonWriter.WriteStartObject();
jsonWriter.WriteRaw(JsonConvert
.SerializeObject(data)
.Substring(1)
.TrimEnd('}'));
jsonWriter.WriteRaw(",");
int inx = 0;
foreach (var item in data.ListaLek)
{
var str = $"{inx++}";
jsonWriter.WritePropertyName(str);
jsonWriter.WriteRawValue(JsonConvert.SerializeObject(item));
}
jsonWriter.WriteEndObject();
jsonWriter.Close();
}
return System.Text.Encoding.UTF8.GetBytes(sb.ToString());
}