我一直在苦苦思索如何从api调用中收到的json响应中解析出所需的数据。下面是响应的开头:
{
"response": {
"results": [
[
1002,
"Brent's Test Product o Fun",
"TEST001",
"1234567-",
"100000000281",
"12345678",
"",
"",
true,
"Brightpearl",
"2020-06-18T13:38:01.000-05:00",
"2021-04-27T07:45:24.000-05:00",
439,
null,
74,
1,
"LIVE",
null
],
[
1003,
"Brent's Test Product 2",
"TEST002",
"",
"",
"",
"",
"",
true,
"Brightpearl",
"2020-08-31T00:53:26.000-05:00",
"2021-04-27T07:45:24.000-05:00",
439,
null,
74,
1,
"LIVE",
null
],
[
1004,
"Brent's Test Product 3",
"TEST003",
"",
"",
"",
"",
"",
true,
"Brightpearl",
"2020-09-16T00:30:55.000-05:00",
"2021-04-27T07:45:24.000-05:00",
439,
null,
74,
1,
"LIVE",
null
],我需要做的是循环遍历嵌套在"results“中的节点。这些实际上是我需要使用的产品skus。在响应的末尾返回了一堆元数据,我没有在这里包含这些元数据。
我创建了这个类来处理结果。
public class SkuSearchResults
{
public int productId { get; set; }
public string productName { get; set; }
public string SKU { get; set; }
public string barcode { get; set; }
public string EAN { get; set; }
public string UPC { get; set; }
public string ISBN { get; set; }
public string MPN { get; set; }
public bool stockTracked { get; set; }
public string salesChannelName { get; set; }
public string createdOn { get; set; }
public string updatedOn { get; set; }
public int brightpearlCategoryCode { get; set; }
public int productGroupId { get; set; }
public int brandId { get; set; }
public int productTypeId { get; set; }
public string productStatus { get; set; }
public int primarySupplierId { get; set; }
}发布于 2021-06-11 07:30:41
如果您还没有解决这个问题,Brightpearl的搜索端点将返回一个通用模式定义和原始结果,而不是GET端点返回的强类型结果。在不深入原因的情况下,剩下的任务就是解析元数据和原始结果,并由此合成您的c#类。幸运的是(和往常一样) Newtonsoft将为你拯救这一天。
创建将接收搜索结果的响应类
public class GenericSearchResult
{
/// <summary>
/// This holds all of the information about the fields returned in the results.
/// </summary>
[JsonProperty("metaData")]
public SearchMetaData MetaData { get; set; }
/// <summary>
/// This is the raw data of the search request
/// </summary>
[JsonProperty("results")]
public dynamic[] Results;
}您可以使用Postman或类似的方法来获取返回到MetaData中的所有属性,但重要的是"columns“元素,它是一个由返回的字段以及它们在结果数组中的出现顺序组成的数组。
JsonConvert.Deserialize()将您的json结果转换成这个结构,您就可以进行手动转换了。
沿着这些思路,你应该可以开始
List<SkuSearchResults> results = new List<SkuSearchResults>();
foreach (dynamic row in searchResponse.Response.Results)
{
//First, Create a JObject
JObject obj = new JObject();
int idx = 0;
//Add the properties to the JObject
foreach (MetaColumn column in searchResponse.Response.MetaData.Columns)
{
obj.Add(new JProperty(column.Name, row[idx++]));
}
//Convert it to the target type
results.Add(obj.ToObject<SkuSearchResults>());
}如果要在不同的端点和结果类中进行大量搜索,当然可以将其转换为泛型函数(T)并合成任何内容。
List<T> MakeObjectsFromSearch<T>(GenericSearchResponse searchResponse)不要忘记添加一些null处理,因为这些搜索经常返回int字段的null(比如您的primarySupplierId和productGroupId属性)
希望这能有所帮助。肯定也让我的头疼了一段时间。
https://stackoverflow.com/questions/67320364
复制相似问题