C#在类中重复相同的字段名称以允许序列化为JSON

时间:2018-05-27 11:21:33

标签: c# json ebay-api

我正在尝试构建一个类,我将其序列化为Web请求的主体。

序列化对象时尝试实现的输出是:

{
  "findCompletedItemsRequest": {
    "keywords": "searchtext",
    "itemFilter": [
      {
        "name": "SoldItemsOnly",
        "value": "true"
      }
    ],
    "outputSelector": "PictureURLLarge",
    "outputSelector": "SellerInfo",
    "paginationInput": {
      "entriesPerPage": "100",
      "pageNumber": "1"
    }
  }
}

对于字段" outputSelector',我可以在0,1或多次使用它。 我怎么在班上定义这个?我尝试过搜索,但我不确定我想要实现的目标是什么。如果我使用列表或数组,它只创建outputSelect JSON属性,其中包含一个数组,而不是多个outputSelector属性。

这是我到目前为止所做的事情(其他评论受到欢迎,因为我来自程序编程背景)

public class eBaySearchBody
        {
            public FindCompletedItemsRequest findCompletedItemsRequest = new FindCompletedItemsRequest();
            public class FindCompletedItemsRequest
            {
                public string keywords { get; set; }
                public List<itemFilters> itemFilter { get; set; }
                public string sortOrder { get; set; }
                public PaginationInput paginationInput = new PaginationInput();

            }
            public class PaginationInput
            {
                public string entriesPerPage { get; set; }
                public string pageNumber { get; set; }
            }
            public class itemFilters
            {
                public string name { get; set; }
                public string value { get; set; }
            }
        }

1 个答案:

答案 0 :(得分:1)

它不是有效的JSON。它有SyntaxError:Duplicate key&#39; outputSelector&#39;在第9行。

enter image description here

如果考虑使用outputSelector数组,则需要按如下方式修改代码以生成有效的JSON。 示例有效JSON:

{
    "findCompletedItemsRequest": {
        "keywords": "searchtext",
        "itemFilter": [{
            "name": "SoldItemsOnly",
            "value": "true"
        }],
        "outputSelector": ["PictureURLLarge", "SellerInfo"],
        "paginationInput": {
            "entriesPerPage": "100",
            "pageNumber": "1"
        }
    }
}

示例C#代码修改:

namespace Solutions{
    using System.Collections.Generic;
    using Newtonsoft.Json;
    public class EBaySearchBody{
        public class FindCompletedItemsRequest{
            [JsonProperty("keywords", Order = 1)]
            public string Keywords { get; set; }

            [JsonProperty("itemFilter",Order = 2)]
            public List<ItemFilter> ItemFilters { get; set; }

            [JsonProperty("outputSelector", Order = 3)]
            public List<string> OutputSelectors { get; set; }

            [JsonProperty("paginationInput", Order = 4)]
            public PaginationInput PaginationInput { get; set; }
        }
        public class PaginationInput{
            [JsonProperty("entriesPerPage", Order = 1)]
            public string EntriesPerPage { get; set; }

            [JsonProperty("pageNumber", Order = 2)]
            public string PageNumber { get; set; }
        }
        public class ItemFilter{
            [JsonProperty("name", Order = 1)]
            public string Name { get; set; }

            [JsonProperty("value", Order = 2)]
            public string Value { get; set; }
        }
        [JsonProperty("findCompletedItemsRequest")]
        public FindCompletedItemsRequest FindCompletedItemsRequestObject { get; set; }

        /// <summary>
        /// Create a <see cref="EBaySearchBody"/>object and serialize it to a JSON stream
        /// </summary>
        /// <returns></returns>
        public static string WriteFromObject()
        {
            //Create EbaySearchBody object.  
            EBaySearchBody searchBody = new EBaySearchBody(){
                    FindCompletedItemsRequestObject = new FindCompletedItemsRequest(){
                        Keywords = "searchtext",
                        ItemFilters = new List<ItemFilter>(){
                            new ItemFilter {
                                Name = "SoldItemsOnly",
                                Value = "true"
                            }
                        },
                        OutputSelectors = new List<string>(){
                            "PictureURLLarge",
                            "SellerInfo"
                        },
                        PaginationInput = new PaginationInput(){
                            EntriesPerPage = "100",
                            PageNumber = "1"
                        }
                    }
                };
            return JsonConvert.SerializeObject(searchBody);
        }
    }
}