首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从C#调用解析奇怪的JSON响应内容

从C#调用解析奇怪的JSON响应内容
EN

Stack Overflow用户
提问于 2021-04-29 23:22:03
回答 1查看 104关注 0票数 0

我一直在苦苦思索如何从api调用中收到的json响应中解析出所需的数据。下面是响应的开头:

代码语言:javascript
复制
{
    "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。在响应的末尾返回了一堆元数据,我没有在这里包含这些元数据。

我创建了这个类来处理结果。

代码语言:javascript
复制
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; }

    }
EN

回答 1

Stack Overflow用户

发布于 2021-06-11 07:30:41

如果您还没有解决这个问题,Brightpearl的搜索端点将返回一个通用模式定义和原始结果,而不是GET端点返回的强类型结果。在不深入原因的情况下,剩下的任务就是解析元数据和原始结果,并由此合成您的c#类。幸运的是(和往常一样) Newtonsoft将为你拯救这一天。

创建将接收搜索结果的响应类

代码语言:javascript
复制
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结果转换成这个结构,您就可以进行手动转换了。

沿着这些思路,你应该可以开始

代码语言:javascript
复制
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)并合成任何内容。

代码语言:javascript
复制
   List<T> MakeObjectsFromSearch<T>(GenericSearchResponse searchResponse)

不要忘记添加一些null处理,因为这些搜索经常返回int字段的null(比如您的primarySupplierId和productGroupId属性)

希望这能有所帮助。肯定也让我的头疼了一段时间。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67320364

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档