You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 18:15:35