![](/img/trans.png)
[英]How to serialize object with the same complex prop types, but different names
[英]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": []}
PurchaseOrderHeader
和PurchaseOrderDetail
)讓我們嘗試從下到上構建它。
PurchaseOrderHeader
和PurchaseOrderDetail
沒問題
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"
}]
}
如果您想序列化多個 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.