如何创建C#对象并序列化为指定格式的JSON字符串
问题描述
需要在C#中生成指定格式的JSON字符串/对象:
{ "retailer_br_id" : "5473182", "retailer_external_id": "", "erp_invoice_number" : "INV-202302", "invoice_date": "2023-04-06T17:00:00.000Z", "status" : 1, "details":[{ "sku_external_id": "TD5015151432201", "quantity" : "2", "price_per_item": "14.5" }, { "sku_external_id": "000005020170898446", "quantity" : 1, "price_per_item": 10.50 } ] }
当前代码仅能生成dList的JSON值,无法得到完整结构,代码如下:
DataTable dt = new DataTable("Details"); dt.Columns.Add("sku_external_id", typeof(string)); //Data dt.Rows.Add("0000000000"); dt.Rows.Add("111111111"); dt.Rows.Add("1222222222"); dt.Rows.Add("3333333333"); Root rt = new Root(); rt.retailer_br_id = "32423432432424"; rt.retailer_external_id = ""; rt.erp_invoice_number = "PBY-202304"; DateTime d = DateTime.Now; string dateString = d.ToString("Y-m-d H:i:s"); rt.invoice_date = dateString; List<Detail> dList = new List<Detail>(); for (int i = 0; i < dt.Rows.Count; i++) { Detail det = new Detail(); det.sku_external_id = (string)dt.Rows[i]["sku_external_id"]; dList.Add(det); } string json = JsonConvert.SerializeObject(dList, Formatting.Indented); textBox1.Text = json;
解决方案
问题核心是你序列化的是单独的dList,而非包含所有字段的Root对象,同时需要补全实体类定义和缺失字段。
1. 补全实体类定义
确保Root和Detail类包含目标JSON的所有字段,其中quantity和price_per_item因为存在字符串/数值两种类型,用object兼容:
public class Root { public string retailer_br_id { get; set; } public string retailer_external_id { get; set; } public string erp_invoice_number { get; set; } public string invoice_date { get; set; } public int status { get; set; } public List<Detail> details { get; set; } } public class Detail { public string sku_external_id { get; set; } public object quantity { get; set; } public object price_per_item { get; set; } }
2. 修正代码逻辑
- 将
dList赋值给Root对象的details属性 - 补全
status字段的值 - 修正日期格式为符合要求的ISO 8601 UTC格式
- 序列化完整的
Root对象
修改后的完整代码:
DataTable dt = new DataTable("Details"); dt.Columns.Add("sku_external_id", typeof(string)); // 添加quantity和price_per_item列模拟数据 dt.Columns.Add("quantity", typeof(object)); dt.Columns.Add("price_per_item", typeof(object)); // 填充模拟数据 dt.Rows.Add("0000000000", "2", "14.5"); dt.Rows.Add("111111111", 1, 10.50); dt.Rows.Add("1222222222", "3", "20.0"); dt.Rows.Add("3333333333", 5, 8.75); Root rt = new Root(); rt.retailer_br_id = "32423432432424"; rt.retailer_external_id = ""; rt.erp_invoice_number = "PBY-202304"; // 生成符合要求的UTC日期格式 rt.invoice_date = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ss.fffZ"); rt.status = 1; List<Detail> dList = new List<Detail>(); for (int i = 0; i < dt.Rows.Count; i++) { Detail det = new Detail(); det.sku_external_id = (string)dt.Rows[i]["sku_external_id"]; det.quantity = dt.Rows[i]["quantity"]; det.price_per_item = dt.Rows[i]["price_per_item"]; dList.Add(det); } // 关联details列表到Root对象 rt.details = dList; // 序列化完整的Root对象 string json = JsonConvert.SerializeObject(rt, Formatting.Indented); textBox1.Text = json;
3. 关键说明
- 用
object类型兼容quantity和price_per_item的字符串/数值混合格式 - 日期格式使用
yyyy-MM-ddTHH:mm:ss.fffZ生成标准UTC时间字符串,和目标格式匹配 - 必须将
dList赋值给Root的details属性后,再序列化整个Root对象才能得到完整JSON结构
内容的提问来源于stack exchange,提问作者Jonathan Diokno
相关产品推荐
相关产品推荐

