如何创建 C# 对象并序列化它

问题描述 投票:0回答:3

在 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;
c# json post serialization
3个回答
0
投票
  1. 您正在序列化

    dList
    ,但不是
    root
    ,这就是为什么它显示序列化的
    dList

  2. 缺少将

    dList
    分配给
    rt.details

rt.details = dList;
        
string json = JsonConvert.SerializeObject(rt, Formatting.Indented);
  1. 要将日期序列化为 ISO 8601 格式:
string dateString = d.ToString("yyyy-MM-ddTHH:MM:sss.fffZ");

替代品

  1. 您可以使用以下方法实现:
    ,而不是使用 
    foreach
     循环迭代并将项目添加到 
    dList
dList = JArray.FromObject(dt)
    .ToObject<List<Detail>>();
  1. 将属性命名为 Pascal Case,并使用
    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; }
}
  1. invoice_date
    属性更改为
    DateTime
    类型,以便它将序列化并显示 ISO 8601 格式,而不是手动定义格式。
rt.invoice_date = DateTime.Now;
[JsonProperty("invoice_date")]
public DateTime invoice_date { get; set; }

0
投票

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;

0
投票

你可以只使用匿名类型

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/

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.