C#如何将ActorRiskAssessments类序列化为无属性名的JSON数组?
问题:序列化类生成无属性名的JSON数组
目标类定义
public class ActorRiskAssessments { public string asOfDate { get; set; } public string type { get; set; } public string value { get; set; } [JsonIgnore] public string id { get; set; } [JsonIgnore] public string pathParameter { get; set; } }
期望生成的JSON格式
[ { "asOfDate": "2019-08-24", "type": "INTERNAL", "value": "string" } ]
当前代码逻辑
List<ActorRiskAssessments> actors = new List<ActorRiskAssessments>(); actors = (from DataRow dr in dataTable.Rows select new ActorRiskAssessments() { id = dr["Actor.Id"].ToString(), asOfDate = DateTime.Now.ToString("yyyy-MM-dd"), type = dr["Actor.type"].ToString(), value = dr["Actor.value"].ToString(), pathParameter = lucinityURL + dr["pathParameter"].ToString() } ).ToList(); cnn.Open(); using (SqlCommand insertCommand = new SqlCommand(insertQuery, cnn)) { foreach (var serializer in actors) { json = JsonSerializer.Serialize(serializer); dtActorRiskAssessments.Rows.Add(new object[] { targetObject, serializer.id, json, serializer.pathParameter }); // add rows to DataTable } var param = insertCommand.Parameters.AddWithValue("@ActorRiskAssessments", dtActorRiskAssessments); param.TypeName = "export.CorrespondenceTableType"; //DataType is required to register on MSSQL Site look a database project for this type insertCommand.ExecuteNonQuery(); insertCommand.Parameters.Clear(); }
解决方案
场景1:将单个对象包裹为JSON数组(每行对应一个数组)
如果需要每行的json字段值是包含单个ActorRiskAssessments对象的数组,修改循环内的序列化逻辑,把当前对象放入临时列表后再序列化即可:
foreach (var serializer in actors) { // 将单个对象存入列表再序列化,生成无属性名的数组格式 json = JsonSerializer.Serialize(new List<ActorRiskAssessments> { serializer }); dtActorRiskAssessments.Rows.Add(new object[] { targetObject, serializer.id, json, serializer.pathParameter }); }
场景2:将整个列表序列化为一个JSON数组(仅一行存储整个数组)
如果需要将所有对象合并成一个JSON数组并作为单个值插入数据库,可去掉循环,直接序列化整个actors列表:
// 序列化整个列表,直接得到无属性名的JSON数组 json = JsonSerializer.Serialize(actors); // 插入单行数据,包含整个数组JSON dtActorRiskAssessments.Rows.Add(new object[] { targetObject, null, json, null }); using (SqlCommand insertCommand = new SqlCommand(insertQuery, cnn)) { var param = insertCommand.Parameters.AddWithValue("@ActorRiskAssessments", dtActorRiskAssessments); param.TypeName = "export.CorrespondenceTableType"; insertCommand.ExecuteNonQuery(); insertCommand.Parameters.Clear(); }
说明
- 你的
ActorRiskAssessments类已经通过[JsonIgnore]标记了不需要序列化的字段,序列化时会自动忽略id和pathParameter,无需额外处理。 - 使用
JsonSerializer.Serialize(List<T>)时,默认会生成无外层属性名的纯数组格式,正好符合需求。
内容的提问来源于stack exchange,提问作者Michał Bryl
相关产品推荐
相关产品推荐

