C#中如何循环生成PayParam的LineItems数组以构造JSON?
如何在C#中批量生成LineItemParam数组以初始化PayParam
我需要向供应商传递JSON文件,供应商接收后返回令牌,为此定义了以下C#类:
public class PayParam { public LineItemParam[] LineItems { get; set; } public string Phone { get; set; } public string Email { get; set; } public string CustomerId { get; set; } public string CompanyName { get; set; } } public class LineItemParam { public string Sku { get; set; } public string Description { get; set; } public decimal UnitPrice { get; set; } public int Quantity { get; set; } }
目前我通过手动赋值构造JSON,但需要为desc数组中的每个描述生成对应的LineItemParam,尝试在对象初始化器中使用foreach循环时出现语法错误,只能手动逐个添加LineItemParam。当前代码如下(存在语法错误):
var parameters = new PayParam(); MailingInfo IdData = scData.FindData(); string[] desc = {"Test1", "Test2", "Test3"}; // 修正原代码缺失的闭合引号 parameters = new PayParam { Phone = IdData.PhoneNumber, Email = IdData.Email.ToUpper(), CustomerId = "1234", CompanyName = "TEST NAME", // 原代码错误地将LineItems写在了初始化器大括号外 LineItems = new LineItemParam[] { new LineItemParam { Sku = GetSKU(), Description = "Test Desc", UnitPrice = 12.00, Quantity = 1 } } };
解决方案
方法1:使用LINQ批量生成数组
直接在对象初始化器中通过LINQ的Select方法遍历desc数组,生成对应的LineItemParam集合,最后转换为数组:
var parameters = new PayParam { Phone = IdData.PhoneNumber, Email = IdData.Email.ToUpper(), CustomerId = "1234", CompanyName = "TEST NAME", LineItems = desc.Select(description => new LineItemParam { Sku = GetSKU(), // 若每个Sku需与描述对应,可调整参数如GetSKU(description) Description = description, UnitPrice = 12.00m, // decimal类型建议加m后缀明确类型 Quantity = 1 }).ToArray() };
方法2:通过List循环添加后转数组
如果不习惯LINQ,可以先创建List<LineItemParam>,循环添加元素后再转换为数组:
var lineItems = new List<LineItemParam>(); foreach (var description in desc) { lineItems.Add(new LineItemParam { Sku = GetSKU(), Description = description, UnitPrice = 12.00m, Quantity = 1 }); } var parameters = new PayParam { Phone = IdData.PhoneNumber, Email = IdData.Email.ToUpper(), CustomerId = "1234", CompanyName = "TEST NAME", LineItems = lineItems.ToArray() };
补充说明
- 原代码中
string[] desc = {"Test1", "Test2", "Test3};缺失了最后一个引号,需修正为"Test3"。 - 对象初始化器中
LineItems必须包含在PayParam的初始化大括号内,原代码的位置错误会导致语法问题。 - 赋值
decimal类型时,建议添加m后缀(如12.00m),避免编译时将浮点数隐式转换为decimal带来的精度问题。
内容的提问来源于stack exchange,提问作者cool
相关产品推荐
相关产品推荐

