在 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 值......................................... ...................................................... ......................................................
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
,这就是为什么它显示序列化的dList
。
缺少将
dList
分配给 rt.details
。
rt.details = dList;
string json = JsonConvert.SerializeObject(rt, Formatting.Indented);
string dateString = d.ToString("yyyy-MM-ddTHH:MM:sss.fffZ");
替代品
,而不是使用
foreach
循环迭代并将项目添加到
dList
dList = JArray.FromObject(dt)
.ToObject<List<Detail>>();
JsonProperty
属性定义序列化和反序列化时使用的属性名称。public class Detail
{
[JsonProperty("sku_external_id")]
public string SkuExternalId { get; set; }
[JsonProperty("quantity")]
public object Quantity { get; set; }
[JsonProperty("price_per_item")]
public object PricePerItem { get; set; }
}
public class Root
{
[JsonProperty("retailer_br_id")]
public string RetailerBrId { get; set; }
[JsonProperty("retailer_external_id")]
public string RetailerExternalId { get; set; }
[JsonProperty("erp_invoice_number")]
public string ErpInvoiceNumber { get; set; }
[JsonProperty("invoice_date")]
public DateTime InvoiceDate { get; set; }
[JsonProperty("status")]
public int Status { get; set; }
[JsonProperty("details")]
public List<Detail> Details { get; set; }
}
invoice_date
属性更改为 DateTime
类型,以便它将序列化并显示 ISO 8601 格式,而不是手动定义格式。rt.invoice_date = DateTime.Now;
[JsonProperty("invoice_date")]
public DateTime invoice_date { get; set; }
json 将只有 dList 的值,因为您还没有将
rt
分配给 det
对象。 我假设 det
有一个可以分配给 rt 值的属性,例如
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.root = rt;
dList.Add(det);
}
如果
det
没有 root 类型的属性,则需要添加一个。
您可能不希望将
root
分配给列表中 det
的每个实例。 如果您想在列表之外分配它一次,那么您将需要一个包装对象,例如。
class MyObject {
public Root root{ get; set; }
public List<Detail> dList { get; set; }
}
修改后的代码将看起来像......
MyObject myobject = new MyObject();
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);
}
myobject.root = myobject;
myobject.dlist = dList;
string json = JsonConvert.SerializeObject(myobject, Formatting.Indented);
textBox1.Text = json;
你可以只使用匿名类型
var obj = new
{
retailer_br_id = 5473182,
retailer_external_id = 0,
erp_invoice_number = "INV-202302",
invoice_date = "2023-04-06T17=00=00.000Z",
status = 1,
details = new[] {
new {
sku_external_id= "TD5015151432201",
quantity = 2,
price_per_item= 14.5
},
new {
sku_external_id= "000005020170898446",
quantity = 1,
price_per_item= 10.50
}
}
};
string json = JsonConvert.SerializeObject(obj, Newtonsoft.Json.Formatting.Indented);
现在如果您愿意,您可以在线将此 JSON 转换为 C# 类 例如使用此链接https://json2csharp.com/