簡體   English   中英

如何序列化對象以包含部分名稱並連接不同的 object 類型?

[英]How do I serialize objects to include section names and concatenate different object types?

我正在將 json 發送到 web 服務,並且正在將我的代碼變成一團糟,試圖將其轉換為帶有部分名稱的預期格式......我如何獲得這個結構?:

[{"HeaderAttributes": 
    [{
        "recid":"RECHEAD",
        "po_number":"PO001BPTest"
    }]
},      
{"LineAttributes": 
    [{
        "recid":"RECLINE",
        "po_number":"PO001BPTest",
        "line":1,
        "item":"004339"
    }]    
}]

我的數據類:

public class POHeader
{
    private string _recID;
    private string _poNumber;

   [JsonProperty("recid", Required = Required.Always)]
    public string RecID
    {
        get { return _recID; }
        set { _recID = value; }
    }

    [JsonProperty("po_number")]
    public string PONumber
    {
        get { return _poNumber; }
        set { _poNumber = value; }
    }
}
public class PODetail
{
   private string _recID;
   private string _poNumber;
   private int? _lineNumber;
   private string _itemCode;

   [JsonProperty("recid", Required = Required.Always)]
    public string RecID
    {
        get { return _recID; }
        set { _recID = value; }
    }

    [JsonProperty("po_number")]
    public string PONumber
    {
        get { return _poNumber; }
        set { _poNumber = value; }
    }
    [JsonProperty("line")]
    public int? LineNumber
    {
        get { return _lineNumber; }
        set { _lineNumber = value; }
    }
    [JsonProperty("item")]
    public string ItemCode
    {
        get { return _itemCode; }
        set { _itemCode = value; }
    }
}
public class PurchaseOrder
{
    private POHeader _headers = new POHeader();
    [JsonProperty("HeaderAttributes")]
    public POHeader POHeaderFields
    {
        get { return _headers; }
        set { _headers = value; }
    }
}

我已經嘗試將這些數據類添加到父采購訂單 class、連接、將 IList 更改為 List 到 object 等。我試圖讓它工作變得一團糟。 這個最新版本是連接 json。 它也不起作用。

這是序列化和推送代碼:

    public static async Task ProcessItemsAsync(object content,  CancellationToken cancellationToken, string path)
    {
        using (var client = new HttpClient())
        {
            client.DefaultRequestHeaders.Accept.Clear();
            client.BaseAddress = new Uri(BaseURL);
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", "CODE");
            using (var request = new HttpRequestMessage(HttpMethod.Post, path))
            {
                var json = JsonConvert.SerializeObject(content);

                using (var stringContent = new StringContent(json, Encoding.UTF8, "application/json"))
                {
                    request.Content = stringContent;

                    using (var response = await client
                        .SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken)
                        .ConfigureAwait(false))
                    {
                        response.EnsureSuccessStatusCode();
                    }
                }
            }
        }

    public static async Task TransmitToService(object header, object lines, CancellationToken cancellationToken, string path)
    {
        await TransmitRecordsToIRMS.ProcessItemsAsync(header, lines, cancellationToken, path);
    }

然后我基本上添加數據......我已經填充了很多不同的方式。 對不起,我的代碼太瘋狂了。

   private static void ProcessPOLines(IList records)
    {
        var poLinesToProcess = new List<POHeader>();
        foreach (POOrder record in records)
        {
            // var poDetailList = new List<PODetail>();
             //POHeader poHeader = new POHeader();
              PurchaseOrder po = new PurchaseOrder();

            po.POHeaderFields.RecID = RECID;
            po.POHeaderFields.PONumber = record.OrderNbr;

            //poHeader.POHeaderFields.RecID = RECID;
            //poHeader.POHeaderFields.PONumber = record.OrderNbr;

            PODetail poDetail = new PODetail();
            foreach (PXResult<POLine, InventoryItem> line in poLines)  //data selects 
            {
                poDetail.POLineFields.Add(new PODetail
                {
                    RecID = "RECID2",
                    PONumber = record.OrderNbr,
                    LineNumber = pline.LineNbr,
                    ItemCode = iitem.InventoryCD
                });
            }

            TransmitToService(po.POHeaderFields, poDetail.POLineFields, CancellationToken.None, poPath).Wait();
            }
        }
    }

我可以在這里看到一些混亂。 讓我試着幫助你。 首先讓我們一起檢查您的 json:

[{"HeaderAttributes": 
    [{
        "recid":"RECHEAD",
        "po_number":"PO001BPTest"
    }]
},      
{"LineAttributes": 
    [{
        "recid":"RECLINE",
        "po_number":"PO001BPTest",
        "line":1,
        "item":"004339"
    }]    
}]
  • 在頂層有一個對象數組:
    • [{}, {}]
  • 在第二層,有些對象只有一個屬性。 該屬性是一個數組:
    • { "lonelyProperty": []}
  • 第三層有普通數據對象( PurchaseOrderHeaderPurchaseOrderDetail

讓我們嘗試從下到上構建它。

3級對象

PurchaseOrderHeaderPurchaseOrderDetail沒問題

第二級 object

PurchaseOrder可以包含

  • PurchaseOrderHeader的屬性
  • 用於收集PurchaseOrderDetail的屬性

例如:

 public class PurchaseOrder
    {
        [JsonProperty("HeaderAttributes")]
        public PurchaseOrderHeader Header {get; set;}
        [JsonProperty("LineAttributes")]
        public List<PurchaseOrderDetail> Details {get; set;}

    }

根據我的理解, PurchaseOrder應該只有一個 header,但如果我的假設是錯誤的,請糾正我。

現在,如果您序列化此 class 的實例,那么您將看到如下內容:

{
  "HeaderAttributes": 
    {
        "recid":"RECHEAD",
        "po_number":"PO001BPTest"
    },
  "LineAttributes": 
    [{
        "recid":"RECLINE",
        "po_number":"PO001BPTest",
        "line":1,
        "item":"004339"
    }]    
}

一級 object

如果您想序列化多個 PurchaseOrders,那么您肯定可以這樣做。 PurchaseOrder的序列化集合如下所示:

[
    {
      "HeaderAttributes": 
        {
            "recid":"RECHEAD",
            "po_number":"PO001BPTest"
        },
      "LineAttributes": 
        [{
            "recid":"RECLINE",
            "po_number":"PO001BPTest",
            "line":1,
            "item":"004339"
        }]    
    },
    {
      "HeaderAttributes": 
        {
            "recid":"RECHEAD",
            "po_number":"PO002BPTest"
        },
      "LineAttributes": 
        [{
            "recid":"RECLINE",
            "po_number":"PO002BPTest",
            "line":1,
            "item":"014379"
        }]    
    }
]

這真的是你想要達到的嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM